KVOController是FaceBook的一個開源庫,提供了方便的姿式讓你去使用KVO。 github.com/facebook/KV…git
大概的用法以下:github
[self.KVOController observe:target keyPath:keyPath options:NSKeyValueObservingOptionNew block:^(id observer, id object, NSDictionary *change) {
id newValue = change[NSKeyValueChangeNewKey];
}];
複製代碼
observe操做完成後,observer會在delloc時移除觀察,很是方便。數組
咱們來看看KVOController的實現流程:ui
1.Observer會建立一個FBKVOController的屬性;spa
2.FBKVOController中包含一個NSMapTable的成員屬性,用來存儲observer的KVO信息;設計
3.FBKVOController建立一個_FBKVOInfo類型的實例,實例中存儲了和KVO操做相關的信息(keypath等),而後將須要觀察的對象Target做爲Key,_FBKVOInfo的實例加入數組(對同一個Target的不一樣keypath的屢次KVO操做)並把數組做爲Value,存入步驟2中的mapTable中;code
4.FBKVOController會調用_FBKVOSharedController的單例中的方法,同時將步驟3建立的info和觀察的target傳入給這個方法,這個單例進行了最終的KVO操做;cdn
5._FBKVOSharedController的單例調用系統KVO方法,將本身做爲觀察者來觀察Target對象。server
在Observer內存被釋放,執行dealloc時,其建立的FBKVOController屬性的dealloc會經過KVOInfoMap找到全部KVO的對象,並執行移除觀察的操做,十分巧妙的設計!對象
可是在使用的過程當中仍是有一些注意事項的: 首先,FBKVOController使用block來傳遞系統KVO的回調,所以要注意retain cycle。 其次,在使用的過程當中,target不能強引用observer,不然也會造成retain cycle。我在上面的實現流程圖中增長了一些標註來講明這個retain cycle是如何造成的:
紅色的箭頭表明了內存持有的方向,能夠很清楚的看到造成了cycle。