Objective c 连接objc_属性
我有一个名为dto的对象。这个物体是另一个物体的孩子,他的父亲是最高等级的物体。我想得到dto及其所有超类的所有属性。事实上,当我想在我的口腔中看到propertyName的时候,我得到了EXC\u BAD\u访问权限。多谢各位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
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并不是一种完全动态、以运行时为中心的语言。