2013-05-14 107 views
1

每當我的對象屬性發生變化或更新時,我想更改一個變量(nonce變量)。這個隨機數是基於時間的。因此,每次更新屬性時,此隨機數都會更新爲當前時間。鍵值觀察:我可以觀察所有屬性的變化嗎?

有什麼辦法可以自動偵聽我物體上的所有關鍵變化嗎?或者我將不得不分別手動維護每個屬性的所有keyvalue觀察者?

非常感謝

+0

[Key Value Observing - 如何觀察對象的所有屬性?](http://stackoverflow.com/questions/13491454/key-value-observing-how-to-observe-all-the -properties-of-an-object) – Caleb 2013-05-14 15:39:47

回答

6

中使用這種技術(排序)你看了一下Obj-C運行時功能嗎?請參閱文檔中的here。例如,這給你一個類Lender的所有屬性的列表。 (順便說一句:我不是在我的Mac,所以這只是直接從文檔的):

@interface Lender : NSObject { 
    float alone; 
} 
@property float alone; 
@end 

你可以使用得到的屬性列表:

id LenderClass = objc_getClass("Lender"); 
unsigned int outCount; 
objc_property_t *properties = class_copyPropertyList(LenderClass, &outCount); 

你就可以得到物業名稱:

const char *property_getName(objc_property_t property) 

如果您將這些名稱傳回addObserver:forKeyPath:options:context您應該是金色的。

+0

這真是太棒了謝謝你。 :)有點迂迴的方式,但非常有用。 :) – 2013-05-15 08:20:59

1

一些想法:

1)你可以要求的屬性和實例變量,它們的類型運行,並利用這些信息來創建,並採取了觀察員。顯然,如果你正在爲一個對象做這件事,很多工作。

2)如果你的屬性是「正規軍」,這意味着所有強的物體,那麼你可以使用@dynamic(防止二傳手/吸氣創建),然後用resolveInstanceMethod:或其他時髦的方法從NSObject的趕setMyObject:myObject電話。實質上你可以做系統爲'set ...'調用做什麼,並動態地獲取變量的字符串。然後,你可以更新/獲得一個伊娃,也許這個伊瓦爾的前綴是「 - 」或什麼的,你就可以做你的觀察員會做的事情。

3)你可以把所有的ivars放在一個「助手」類中,然後使用forwardingTargetForSelector:將所有的設置者指向它(這當然可以回覆你)。我在one of my github projects