Objective c 连接objc_属性

Objective c 连接objc_属性,objective-c,properties,concatenation,exc-bad-access,Objective C,Properties,Concatenation,Exc Bad Access,我有一个名为dto的对象。这个物体是另一个物体的孩子,他的父亲是最高等级的物体。我想得到dto及其所有超类的所有属性。事实上,当我想在我的口腔中看到propertyName的时候,我得到了EXC\u BAD\u访问权限。多谢各位 unsigned int i, superPropertyCount, propertyCount; objc_property_t *properties = class_copyPropertyList([dto class], &propertyCount

我有一个名为dto的对象。这个物体是另一个物体的孩子,他的父亲是最高等级的物体。我想得到dto及其所有超类的所有属性。事实上,当我想在我的口腔中看到propertyName的时候,我得到了EXC\u BAD\u访问权限。多谢各位

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)];
}
无符号整数i、超级属性计数、属性计数;
objc_property_t*properties=class_copyPropertyList([dto类],&propertyCount);
if([[dto类]isSubclassOfClass:[NSObject类]])
{
memcpy(属性、属性、属性计数*sizeof(objc_property_t));
id超类=[[dto类]超类];
while([superClass isSubclassOfClass:[NSObject class]])
{
objc_property_t*superproperty=class_copyPropertyList(超类和superPropertyCount);
属性=malloc((属性计数+超级属性计数)*sizeof(对象属性计数));
如果(属性!=NULL)
{
memcpy(属性、属性、属性计数*sizeof(objc_property_t));
memcpy(属性+属性计数、超级属性、超级属性计数*sizeof(objc_property_t));
}
propertyCount=propertyCount+超级propertyCount;
超类=[超类超类];
}
}
对于(i=0;i
您正在松开位于的属性指针

properties = malloc((propertyCount + superPropertyCount) * sizeof(objc_property_t));
下一行代码:

memcpy(properties, properties, propertyCount * sizeof(objc_property_t));
没有任何效果


顺便说一句,不要忘了用
class\u copyPropertyList
malloc
释放分配的内存,因为您正在丢失指向属性的指针

properties = malloc((propertyCount + superPropertyCount) * sizeof(objc_property_t));
下一行代码:

memcpy(properties, properties, propertyCount * sizeof(objc_property_t));
没有任何效果

顺便说一句,别忘了用
class\u copyPropertyList
malloc

释放分配的内存。虽然探测运行时的深度非常有趣——非常有用,也很有教育意义,但在生产代码中通常要避免这种自省。它充满了脆弱性。Objective-C并不是一种完全动态的、以运行时为中心的语言。虽然探究运行时的深度非常有趣(有用且有教育意义),但在生产代码中通常要避免这种自省。它充满了脆弱性。Objective-C并不是一种完全动态、以运行时为中心的语言。