这很简单吗?我实际上是想监视对象是否发生变化(以确定是否应该保存它)。目前我只在对象中有一个数组,其中包含所有readwrite属性的列表,然后在创建对象后循环遍历它并添加观察者:
for ( NSString *observer in _observers ){
[self addObserver: self forKeyPath: observer options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context: nil];
}
它可以工作,但是如果你忘了向数组添加一个属性,显然不会调用观察者。有谁知道如何在运行时确定对象的属性?我当时认为它可能是关于respondsToSelector的:但我在这个问题上找不到多少。
提前致谢!
答案 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