在Objective-C中获取对象的属性数组

时间:2009-12-17 09:49:50

标签: objective-c properties object

是否可以在Objective C中获取所有对象属性的数组?基本上,我想要做的是这样的事情:

- (void)save {
   NSArray *propertyArray = [self propertyNames];
   for (NSString *propertyName in propertyArray) {
      [self doSomethingCoolWithValue:[self valueForKey:propertyName]];
   }
}

这可能吗?它似乎应该是,但我无法弄清楚我的propertyNames应该采用什么方法。

2 个答案:

答案 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()释放数组。