KVO實(shí)現(xiàn)原理

1.KVO是基于runtime機(jī)制實(shí)現(xiàn)的

2.當(dāng)某個(gè)類的屬性對(duì)象第一次被觀察時(shí)沟于,系統(tǒng)就會(huì)在運(yùn)行期動(dòng)態(tài)地創(chuàng)建該類的一個(gè)派生類摩梧,在這個(gè)派生類中重寫基類中任何被觀察屬性的setter 方法。派生類在被重寫的setter方法內(nèi)實(shí)現(xiàn)真正的通知機(jī)制

3.如果原類為Person祭阀,那么生成的派生類名為NSKVONotifying_Person

4.每個(gè)類對(duì)象中都有一個(gè)isa指針指向當(dāng)前類,當(dāng)一個(gè)類對(duì)象的第一次被觀察,那么系統(tǒng)會(huì)偷偷將isa指針指向動(dòng)態(tài)生成的派生類回右,從而在給被監(jiān)控屬性賦值時(shí)執(zhí)行的是派生類的setter方法

5.鍵值觀察通知依賴于NSObject 的兩個(gè)方法: willChangeValueForKey: 和 didChangevlueForKey:;在一個(gè)被觀察屬性發(fā)生改變之前漱挚, willChangeValueForKey:一定會(huì)被調(diào)用翔烁,這就 會(huì)記錄舊的值。而當(dāng)改變發(fā)生后旨涝,didChangeValueForKey:會(huì)被調(diào)用蹬屹,繼而 observeValueForKey:ofObject:change:context: 也會(huì)被調(diào)用。

KVO深入原理

1.Apple 使用了 isa 混寫(isa-swizzling)來實(shí)現(xiàn) KVO 。當(dāng)觀察對(duì)象A時(shí)慨默,KVO機(jī)制動(dòng)態(tài)創(chuàng)建一個(gè)新的名為:?NSKVONotifying_A的新類贩耐,該類繼承自對(duì)象A的本類,且KVO為NSKVONotifying_A重寫觀察屬性的setter?方法厦取,setter?方法會(huì)負(fù)責(zé)在調(diào)用原?setter?方法之前和之后潮太,通知所有觀察對(duì)象屬性值的更改情況。

2.NSKVONotifying_A類剖析:在這個(gè)過程虾攻,被觀察對(duì)象的 isa 指針從指向原來的A類铡买,被KVO機(jī)制修改為指向系統(tǒng)新創(chuàng)建的子類 NSKVONotifying_A類,來實(shí)現(xiàn)當(dāng)前類屬性值改變的監(jiān)聽霎箍;

3.所以當(dāng)我們從應(yīng)用層面上看來奇钞,完全沒有意識(shí)到有新的類出現(xiàn),這是系統(tǒng)“隱瞞”了對(duì)KVO的底層實(shí)現(xiàn)過程漂坏,讓我們誤以為還是原來的類景埃。但是此時(shí)如果我們創(chuàng)建一個(gè)新的名為“NSKVONotifying_A”的類(),就會(huì)發(fā)現(xiàn)系統(tǒng)運(yùn)行到注冊(cè)KVO的那段代碼時(shí)程序就崩潰顶别,因?yàn)橄到y(tǒng)在注冊(cè)監(jiān)聽的時(shí)候動(dòng)態(tài)創(chuàng)建了名為NSKVONotifying_A的中間類纠亚,并指向這個(gè)中間類了。

4.(isa 指針的作用:每個(gè)對(duì)象都有isa 指針筋夏,指向該對(duì)象的類蒂胞,它告訴 Runtime 系統(tǒng)這個(gè)對(duì)象的類是什么。所以對(duì)象注冊(cè)為觀察者時(shí)条篷,isa指針指向新子類骗随,那么這個(gè)被觀察的對(duì)象就神奇地變成新子類的對(duì)象(或?qū)嵗┝恕#?因而在該對(duì)象上對(duì) setter 的調(diào)用就會(huì)調(diào)用已重寫的 setter赴叹,從而激活鍵值通知機(jī)制鸿染。

5.子類setter方法剖析:KVO的鍵值觀察通知依賴于 NSObject 的兩個(gè)方法:willChangeValueForKey:和 didChangevlueForKey:,在存取數(shù)值的前后分別調(diào)用2個(gè)方法: 被觀察屬性發(fā)生改變之前乞巧,willChangeValueForKey:被調(diào)用涨椒,通知系統(tǒng)該 keyPath?的屬性值即將變更;當(dāng)改變發(fā)生后绽媒, didChangeValueForKey: 被調(diào)用蚕冬,通知系統(tǒng)該 keyPath?的屬性值已經(jīng)變更;之后是辕,?observeValueForKey:ofObject:change:context: 也會(huì)被調(diào)用囤热。且重寫觀察屬性的setter?方法這種繼承方式的注入是在運(yùn)行時(shí)而不是編譯時(shí)實(shí)現(xiàn)的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末获三,一起剝皮案震驚了整個(gè)濱河市旁蔼,隨后出現(xiàn)的幾起案子锨苏,更是在濱河造成了極大的恐慌,老刑警劉巖棺聊,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伞租,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡限佩,警方通過查閱死者的電腦和手機(jī)肯夏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來犀暑,“玉大人,你說我怎么就攤上這事烁兰∧涂鳎” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵沪斟,是天一觀的道長广辰。 經(jīng)常有香客問我,道長主之,這世上最難降的妖魔是什么择吊? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮槽奕,結(jié)果婚禮上几睛,老公的妹妹穿的比我還像新娘。我一直安慰自己粤攒,他們只是感情好所森,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著夯接,像睡著了一般焕济。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盔几,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天晴弃,我揣著相機(jī)與錄音奸鸯,去河邊找鬼捻脖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛顶岸,可吹牛的內(nèi)容都是我干的芯丧。 我是一名探鬼主播旗国,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼注整!你這毒婦竟也來了能曾?” 一聲冷哼從身側(cè)響起度硝,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寿冕,沒想到半個(gè)月后蕊程,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驼唱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年藻茂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玫恳。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辨赐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出京办,到底是詐尸還是另有隱情掀序,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布惭婿,位于F島的核電站不恭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏财饥。R本人自食惡果不足惜换吧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望钥星。 院中可真熱鬧沾瓦,春花似錦、人聲如沸谦炒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽编饺。三九已至乖篷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間透且,已是汗流浹背撕蔼。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秽誊,地道東北人鲸沮。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像锅论,于是被迫代替她去往敵國和親讼溺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • KVC 什么是KVC KVC是Key-Value-Coding 的簡(jiǎn)稱最易。 KVC是一種可以直接通過字符串的名字ke...
    Jack_deng閱讀 1,028評(píng)論 0 0
  • KVO KVO 是 Key-Value-Observing 的簡(jiǎn)稱怒坯。 KVO 是一個(gè)觀察者模式炫狱。觀察一個(gè)對(duì)象的屬性...
    louuXinnn閱讀 366評(píng)論 0 0
  • 一、概述 二剔猿、KVO基本原理 1.KVO是基于runtime機(jī)制實(shí)現(xiàn)的2.當(dāng)某個(gè)類的屬性對(duì)象第一次被觀察時(shí)视译,系統(tǒng)就...
    ForScanf閱讀 725評(píng)論 0 0
  • 前言 Key-Value-Observer,它來源于觀察者模式, 其基本思想(copy于某度)是一個(gè)目標(biāo)對(duì)象管理所...
    CholMay閱讀 3,398評(píng)論 6 18
  • 一、概述 KVO归敬,即:Key-Value Observing酷含,它提供一種機(jī)制,當(dāng)指定的對(duì)象的屬性被修改后汪茧,則其觀察...
    DeerRun閱讀 10,057評(píng)論 11 33