2011-03-24 57 views
3

我有簡單的二傳手一樣簡單的二傳手仍然會產生變化值通知

- (void) setValue: (int) newVal 
{ 
    value = newVal; 
} 

其中valueint value;實例變量。

這怎麼可能,使用[myobj setValue: 10];仍然生成通知觀察員,儘管我的setter不做任何明確地通知(即它不叫willChangeValueForKey也不didChangeValueForKey)。

不知道它是否相關,但我使用普通的舊式Mac OS X.這在iOS上有什麼不同嗎?

回答

2

可可(和CocoaTouch)使用稱爲「isa-swizzling」的技術來支持自動KVO。

它通過動態繼承觀察對象的類來覆蓋觀察屬性的setter。重寫的方法的實現發送willChangeValueForKey:didChangeValueForKey:消息(當然,在它們之間調用原始實現)。

當設置觀察對象時,對象的原始isa指針(指向對象的類)將被新的動態創建的子類替換。由於子類不會添加到對象的大小,所以這可能不會損害內存佈局。

+0

有趣。這件事並不像人們想象的那麼微不足道。謝謝。 – 2011-03-24 20:31:57

+0

請注意,isa-swizzling的東西是一個實現細節。當然有趣的東西,但不是你在實施過程中需要考慮的東西。 – bbum 2011-03-24 21:03:01

2

你可能要實現:

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)theKey 

搜索這個蘋果文檔的志願指南中,它會詳細說明如何禁止自動KVO通知。