KVO內部實現(xiàn)原理

KVO接口說明

注冊:addObserver:forKeyPath:options:context:

例如

[self.busModel ?addObserver: self ?forKeyPath: @"name" options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOldcontext:@"bus name"];

1>.self.busModel :要監(jiān)聽的對象

2>.self 觀察者,負責處理監(jiān)聽事件的對象

3>.監(jiān)聽的屬性

4>.觀察的選項(例如新值)

5>.上下文,用于傳遞數據,可以利用它區(qū)分不同的監(jiān)聽

屬性改變時調用的方法

- (void)observeValueForKeyPath:(NSString *)keyPath ? ofObject:(id)object ?change:(NSDictionary *)change ? context:(void*)context

1>.監(jiān)聽的屬性

2>.屬性所屬對象

3>.屬性的變化

4>.上下文


Apple的文檔對 KVO 實現(xiàn)的描述:

Automatic key-value observing is implemented using a technique called isa-swizzling... When an observer is registered for an attribute of an object the isa pointer of the observed object is modified, pointing to an intermediate class rather than at the true class ...

并未過多的暴露內部實現(xiàn)的細節(jié):是通過isa-swizzling(isa混編)來實現(xiàn)的

其實當我們觀察一個對象時,會動態(tài)的創(chuàng)建一個新類,這個類繼承與我們所觀察的對象所在的類,并重寫了觀察對象的屬性的setter方法,在setter方法中實現(xiàn)真正的通知機制:

如圖:


1.每個類對象中都有一個isa指針指向當前類,當一個類對象的第一次被觀察,那么系統(tǒng)會偷偷將isa(isa 指針告訴 Runtime 系統(tǒng)這個對象的類是什么)指針指向動態(tài)生成新類,從而在給被監(jiān)控屬性賦值時執(zhí)行的是派生類的setter方法

2.鍵值觀察通知依賴于 NSObject 的兩個方法:willChangeValueForKey:和didChangevlueForKey:。在一個被觀察屬性發(fā)生改變之前,willChangeValueForKey:一定會被調用,這就會記錄舊的值。而當改變發(fā)生后didChangeValueForKey:也會被調用,在observers列表中檢查是否有該屬性,有的話observeValueForKey:ofObject:change:context:也會被調用

經測試observeValueForKey是在didChangeValueForKey執(zhí)行時調用的

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 轉至元數據結尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 2,058評論 0 9
  • KVO基本概念:主要用來監(jiān)聽某個對象的某個屬性的變化,當發(fā)生變化的時候,觀察者會調用對應的函數,實現(xiàn)對應的功能。 ...
    _那有只喵閱讀 679評論 3 2
  • KVO是基于runtime機制實現(xiàn)的 當某個類的屬性對象第一次被觀察時,系統(tǒng)就會在運行期動態(tài)地創(chuàng)建該類的一個派生類...
    泥孩兒0107閱讀 126評論 0 0
  • KVO內部實現(xiàn)原理 -->KVO是基于runtime機制實現(xiàn)的 -->當某個類的屬性對象第一次被觀察時,系統(tǒng)就會在...
    牧馬人_hlc閱讀 810評論 1 12
  • 《用戶體驗要素》對想做產品的同學是一本很好的思想指導書.這本書對一個產品的形成過程進行解耦,將用戶體驗的好壞歸為不...
    你的小美女哇閱讀 244評論 0 0

友情鏈接更多精彩內容