KVO基本原理

當(dāng)觀察某對象A的時候,KVO機(jī)制動態(tài)創(chuàng)建一個對象A當(dāng)前類的子類,并未這個新的子類重寫了被觀察屬性keyPath的setter方法,setter方法隨后負(fù)責(zé)通知觀察對象屬性的改變狀況

剖析

Apple使用了isa混寫(isa-swizzling)來實現(xiàn)KVO。當(dāng)觀察對象A的時候,KVO動態(tài)創(chuàng)建一個新的名為:NSKVONotifying_A的新類,該類繼承自對象A的本類,且KVO為NSKVONotifying_A重寫觀察屬性的setter方法,setter方法會負(fù)責(zé)在調(diào)用原setter方法之前和之后,通知所有觀察對象屬性的更改情況.

  • NSKVONotifying_A類的剖析

在這個過程,被觀察對象的isa指針從指向原來的A類,被KVO機(jī)制修改為指向系統(tǒng)新創(chuàng)建的子類NSKVONotifying_A類,來實現(xiàn)當(dāng)前類屬性值改變的監(jiān)聽;
所以當(dāng)我們從應(yīng)用層面上看來,完全沒有意識到有新的類出現(xiàn),這是系統(tǒng)“隱瞞”了對KVO的底層實現(xiàn)過程,讓我們誤以為還是原來的類。但是此時如果我們創(chuàng)建一個新的名為“NSKVONotifying_A”的類(),就會發(fā)現(xiàn)系統(tǒng)運行到注冊KVO的那段代碼時程序就崩潰,因為系統(tǒng)在注冊監(jiān)聽的時候動態(tài)創(chuàng)建了名為NSKVONotifying_A的中間類,并指向這個中間類了。

  • 子類setter方法剖析

KVO的鍵值觀察通知依賴于 NSObject 的兩個方法:willChangeValueForKey:didChangeValueForKey:,在存取數(shù)值的前后分別調(diào)用2個方法:被觀察屬性發(fā)生改變之前,willChangeValueForKey:被調(diào)用,通知系統(tǒng)該 keyPath 的屬性值即將變更;當(dāng)改變發(fā)生后, didChangeValueForKey: 被調(diào)用,通知系統(tǒng)該 keyPath 的屬性值已經(jīng)變更;之后, observeValueForKey:ofObject:change:context: 也會被調(diào)用。且重寫觀察屬性的setter 方法這種繼承方式的注入是在運行時而不是編譯時實現(xiàn)的。

原文鏈接:http://www.lxweimin.com/p/e59bb8f59302

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,762評論 0 9
  • 上半年有段時間做了一個項目,項目中聊天界面用到了音頻播放,涉及到進(jìn)度條,當(dāng)時做android時候處理的不太好,由于...
    DaZenD閱讀 3,038評論 0 26
  • 本文分為2個部分:概念與應(yīng)用。概念部分旨在剖析 KVO 這一設(shè)計模式的實現(xiàn)原理;應(yīng)用部分通過創(chuàng)建的項目,以說明 K...
    啊左閱讀 57,925評論 107 438
  • 一、概述 KVO,即:Key-Value Observing,它提供一種機(jī)制,當(dāng)指定的對象的屬性被修改后,則其觀察...
    DeerRun閱讀 10,112評論 11 33
  • iOS--KVO的實現(xiàn)原理與具體應(yīng)用 長時間不用容易忘,這篇文章挺好的.轉(zhuǎn)載自看本文分為2個部分:概念與應(yīng)用。概念...
    超_iOS閱讀 1,449評論 0 17