Cocoa - 在运行时确定类的属性

时间:2011-03-16 21:26:14

标签: objective-c cocoa xcode

这很简单吗?我实际上是想监视对象是否发生变化(以确定是否应该保存它)。目前我只在对象中有一个数组,其中包含所有readwrite属性的列表,然后在创建对象后循环遍历它并添加观察者:

for ( NSString *observer in _observers ){
    [self addObserver: self forKeyPath: observer options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context: nil];
}

它可以工作,但是如果你忘了向数组添加一个属性,显然不会调用观察者。有谁知道如何在运行时确定对象的属性?我当时认为它可能是关于respondsToSelector的:但我在这个问题上找不到多少。

提前致谢!

2 个答案:

答案 0 :(得分:6)

对象的属性在合成后,其行为几乎与普通对象的方法相同,因此您可以进行以下检查

if ([myObject respondsToSelector: @selector(propertyName)]) {
    // your code here
}

或者如果您想使用字符串作为选择器的名称:

if ([myObject respondsToSelector: NSSelectorFromString(@"propertyName")]) {
    // your code here
}

此处propertyName是一个getter(它的签名名称与您声明的属性名称完全对应),因此如果要检查setter的存在,则应添加其他表达式:

[myObject respondsToSelector: @selector(setPropertyName:)])

答案 1 :(得分:3)

可能会有所帮助:

您可以使用class_copyPropertyList

获取课程中的属性列表
objc_property_t * class_copyPropertyList(Class cls, unsigned int *outCount)

然后从每个属性中使用property_getName函数和属性使用property_getAttributes函数获取其名称(如果需要过滤读写属性)。

有关详细信息,请参阅Objective-c Runtime Reference