2011-03-16 68 views
2

這很簡單嗎?我實際上試圖監視一個對象是否改變(以確定我是否應該保存它)。目前,我只是在對象的數組這一切的列表,通過它的讀寫性能,然後我循環創建並添加觀察對象之後:可可 - 在運行時確定一個類的屬性

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

它的工作原理,但如果你忘記添加屬性的數組,顯然這個觀察者不會被調用。有誰知道我怎麼才能在運行時確定對象的屬性?我想這可能是在respondsToSelector的周圍:但我一直沒有找到關於這個問題的很多東西。

在此先感謝!

+0

一個更好的方式來做到這將是一個'hasChanged'依賴的關鍵:http://developer.apple。 com/library/ios /#DOCUMENTATION/Cocoa/Conceptual/KeyValueObserving/Articles/KVODependentKeys.html%23 // apple_ref/doc/uid/20002179-BAJEAIEE – Chuck 2011-03-16 22:42:34

回答

6

屬性,它們已被合成後,表現得幾乎像普通對象的方法,所以你可以做以下檢查

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

或者,如果你想使用字符串作爲選擇的名字:

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

這裏propertyName是的吸氣劑(它的招牌名稱完全符合您的DECL ARED屬性名),所以如果你想檢查二傳手存在,你應該增加額外的表情:

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

'NSSelectorFromString()'給你一個選擇器而不需要'@selector()' – JeremyP 2011-03-16 22:08:49

+0

@JeremyP:謝謝你,修正 – 2011-03-16 22:13:44

3

可能,這將幫助:

可以使用class_copyPropertyList

objc_property_t * class_copyPropertyList(Class cls, unsigned int *outCount) 

,然後從每個屬性,你可以使用property_getName功能得到它的名字得到一個類屬性的列表,並使用property_getAttributes功能屬性(如果您需要過濾讀寫屬性)。

欲瞭解更多詳情,請參閱對象的Objective-c Runtime Reference

+0

+1,儘管這隻複製'cls'上聲明的屬性, *不*在超類中聲明。 – 2011-03-16 22:36:28

+1

它也不適用於沒有KVO兼容實現的'@ property'聲明。它不適用於以傳統方式聲明的setter/getter方法(think-frame和-setFrame :)。總而言之,你*可以做這樣的事情,但這條道路是瘋狂的;你真的不想在你的基礎設施中使用這種自動化的全方位的行爲。 – bbum 2011-03-16 23:29:13

+0

至於bbum說,他一直都是正確的。 – 2011-03-17 01:42:45

相關問題