2016-04-26 3 views
1

У меня есть объект с именем dto. Этот объект является дочерним по отношению к другому, а высший класс его отца - NSObject. Я хотел бы получить все свойства dto и всех его суперклассов. На самом деле я получаю EXC_BAD_ACCESS, когда хочу видеть свойство property в моем bucle. Большое спасибо!Concatenate objc_property_t

unsigned int i, superPropertyCount, propertyCount; 
objc_property_t *properties = class_copyPropertyList([dto class], &propertyCount); 

if ([[dto class] isSubclassOfClass:[NSObject class]]) 
{ 
    memcpy(properties, properties, propertyCount * sizeof(objc_property_t)); 
    id superClass = [[dto class] superclass]; 
    while ([superClass isSubclassOfClass:[NSObject class]]) 
    { 
     objc_property_t *superProperties = class_copyPropertyList(superClass, &superPropertyCount); 

     properties = malloc((propertyCount + superPropertyCount) * sizeof(objc_property_t)); 

     if (properties != NULL) 
     { 
      memcpy(properties, properties, propertyCount * sizeof(objc_property_t)); 
      memcpy(properties+propertyCount, superProperties, superPropertyCount * sizeof(objc_property_t)); 
     } 
     propertyCount = propertyCount + superPropertyCount; 
     superClass = [superClass superclass]; 
    } 
} 

for (i = 0; i < propertyCount; i++) 
{ 
    objc_property_t property = properties[i]; 
    NSString *propertyName = [NSString stringWithUTF8String: property_getName(property)]; 
} 
+2

Несмотря на то, что очень интересно - полезно и образовательно - чтобы отбросить глубины среды выполнения, такого рода самоанализ, как правило, следует избегать в производственном коде. Он изобилует хрупкостью. Objective-C на самом деле не предназначен для полностью динамического, ориентированного на выполнение времени, языка. – bbum

ответ

3

Вы освобождаете указатель на свойства при

properties = malloc((propertyCount + superPropertyCount) * sizeof(objc_property_t)); 

Следующая строка кода:

memcpy(properties, properties, propertyCount * sizeof(objc_property_t)); 

не имеет никакого эффекта.

BTW. не забудьте освободить выделенную память с помощью class_copyPropertyList и malloc.

+0

Большое спасибо! :) – Patrick