iOS 基礎學習 之 KVO

九層之臺,起于累土

Apple 用什么方式實現(xiàn)對一個對象的的 KVO 羡榴?

官方文檔:

Key-Value Observing Implementation Details

Automatic key-value observing is implemented using a technique called?isa-swizzling.

The isa pointer, as the name suggests, points to the object's class which maintains a dispatch table. This dispatch table essentially contains pointers to the methods the class implements, among other data.

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. As a result the value of the isa pointer does not necessarily reflect the actual class of the instance.

You should never rely on the isa pointer to determine class membership. Instead, you should use theclassmethod to determine the class of an object instance.

翻譯:

鍵值觀察實現(xiàn)細節(jié):

自動鍵值觀察使用一種叫做 isa-swizzling 的技術(shù)來實現(xiàn)的立由。

通過 isa 指針的名字可以看出沛豌,只想對象類別的指針維護了一個分發(fā)表舌仍。這個分發(fā)表包括了指向了這個類的方法的的指針铃拇,包括了志向類實現(xiàn)的指針蜈首,以及其他數(shù)據(jù)实抡。

當一個觀察者被注冊觀察某一對象的屬性時,被觀察者的 isa 指針發(fā)生了修改欢策,它指向了一個中間類而不是被觀察者的真實的類吆寨。這就造成了被觀察者的類的 isa 指針不能準確的反映出這個實例(對象)的真實的 類別(Class)。

你永遠不能通過 isa 指針來判斷一個類的關(guān)系踩寇。而是通過實例(對象)的 class 方法來判斷來判斷這個實例的類別啄清。

(僅供參考,如有錯誤俺孙,請予以指正)

?? 以下內(nèi)容非原創(chuàng)辣卒,寫在這兒僅用于學習,出處為?iOS面試題集錦(附答案)- ChenYilong

從 Apple 的官方文檔可以看出: Apple 并不希望過多暴露 KVO 的實現(xiàn)細節(jié)睛榄。不過可以通過 runtime 提供的方法來進行深入了解:

當觀察一個對象時荣茫,一個新的類會被動態(tài)創(chuàng)建。這個被動態(tài)創(chuàng)建的新類是繼承自該對象原有的類场靴,并重寫了被觀察屬性的 setter 方法啡莉。重寫的 setter 方法會負責在調(diào)用原 setter 方法之前和之后,通知所有觀察對象值得更改旨剥。最后通過 isa 混寫 (isa-swizzling [?swiz?l] )把這個對象的 isa 指針指向這個新創(chuàng)建的子類咧欣,對象就神奇的變成了新創(chuàng)建的子類的實例。

詳細解釋:

鍵值觀察通知依賴于 NSObject 的兩個方法:willChangeValueForKey: 和 didChangeValueForKey: 轨帜。在一個被觀察屬性發(fā)生改變之前魄咕, willChangeValueForKey: 一定會被調(diào)用,這就會記錄就的值蚌父,而改變發(fā)生后哮兰,didChangeValueForKey: 會被調(diào)用,繼而 observeValueForKey:ofObject:change:context: 也會被調(diào)用苟弛『戎停可以手動實現(xiàn)這些調(diào)用,但很少有人這么做嗡午。一般我們只在希望能控制回調(diào)的調(diào)用時機時才會這么做囤躁。大部分情況下冀痕,改變通知會自動調(diào)用荔睹。

具體研究過程:KVO 實現(xiàn)原理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狸演,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子僻他,更是在濱河造成了極大的恐慌宵距,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吨拗,死亡現(xiàn)場離奇詭異满哪,居然都是意外死亡,警方通過查閱死者的電腦和手機劝篷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門哨鸭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人娇妓,你說我怎么就攤上這事像鸡。” “怎么了哈恰?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵只估,是天一觀的道長。 經(jīng)常有香客問我着绷,道長蛔钙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任荠医,我火速辦了婚禮吁脱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘子漩。我一直安慰自己豫喧,他們只是感情好,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布幢泼。 她就那樣靜靜地躺著紧显,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缕棵。 梳的紋絲不亂的頭發(fā)上孵班,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機與錄音招驴,去河邊找鬼篙程。 笑死,一個胖子當著我的面吹牛别厘,可吹牛的內(nèi)容都是我干的虱饿。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼氮发!你這毒婦竟也來了渴肉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤爽冕,失蹤者是張志新(化名)和其女友劉穎仇祭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颈畸,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡乌奇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了眯娱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片礁苗。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖徙缴,靈堂內(nèi)的尸體忽然破棺而出寂屏,到底是詐尸還是另有隱情,我是刑警寧澤娜搂,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布迁霎,位于F島的核電站,受9級特大地震影響百宇,放射性物質(zhì)發(fā)生泄漏考廉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一携御、第九天 我趴在偏房一處隱蔽的房頂上張望昌粤。 院中可真熱鬧,春花似錦啄刹、人聲如沸涮坐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袱讹。三九已至,卻和暖如春昵时,著一層夾襖步出監(jiān)牢的瞬間捷雕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工壹甥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留救巷,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓句柠,卻偏偏與公主長得像浦译,于是被迫代替她去往敵國和親棒假。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

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