是否可以在Objective C中获取所有对象属性的数组?基本上,我想要做的是这样的事情:
- (void)save {
NSArray *propertyArray = [self propertyNames];
for (NSString *propertyName in propertyArray) {
[self doSomethingCoolWithValue:[self valueForKey:propertyName]];
}
}
这可能吗?它似乎应该是,但我无法弄清楚我的propertyNames
应该采用什么方法。
答案 0 :(得分:9)
我做了一些挖掘,并在Objective-C Runtime Programming Guide找到了我想要的东西。以下是我在原始问题中实现我想要做的事情,大量借鉴了Apple的示例代码:
#import <Foundation/NSObjCRuntime.h>
#import <objc/runtime.h>
- (void)save {
id currentClass = [self class];
NSString *propertyName;
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList(currentClass, &outCount);
for (i = 0; i < outCount; i++) {
objc_property_t property = properties[i];
propertyName = [NSString stringWithCString:property_getName(property)];
[self doSomethingCoolWithValue:[self valueForKey:propertyName]];
}
}
我希望这会帮助其他人寻找以编程方式访问对象属性名称的方法。
答案 1 :(得分:2)
别忘了
free(properties);
在循环之后你会得到泄漏。苹果文档很清楚:
描述属性的objc_property_t类型的指针数组 由班级宣布。超类声明的任何属性都不是 包括在内。该数组包含* outCount指针,后跟NULL 终止。 您必须使用free()释放数组。