iOS KVO原理

1霞篡、當(dāng)一個(gè)對(duì)象被觀察時(shí)歪今,runtime會(huì)動(dòng)態(tài)自動(dòng)創(chuàng)建繼承該對(duì)象的類,
2践美、并重寫被觀察對(duì)象的setter和getter方法洗贰,setter負(fù)責(zé)調(diào)用原setter并通知所有觀察對(duì)象值的改變;
3陨倡、 最后把該對(duì)象的指針指向這個(gè)創(chuàng)建的子類敛滋,對(duì)象就變成該子類的實(shí)例;
4兴革、 如何創(chuàng)建手動(dòng)觸發(fā)KVO矛缨,在setter方法里手動(dòng)實(shí)現(xiàn)
willChangeValueForKey 與 didChangeValueForKey

1. KVO是通過isa-swizzing的方法來實(shí)現(xiàn)的。就是比如B作為觀察者觀察A的屬性name時(shí)帖旨,在運(yùn)行時(shí)會(huì)動(dòng)態(tài)生成一個(gè)A的子類notify_A類,然后將A類的實(shí)例對(duì)象的isa指針指向notify_A這個(gè)子類灵妨,然后在子類中重寫的方法有三個(gè)

- (void) setName:(NSString*) name
{
    willChangeValueForKey;
    _name = name;
    didChangeValueForKey;
}

2. 重寫了class方法解阅,返回的是原來的A類對(duì)象,這樣的話內(nèi)部再調(diào)用A類實(shí)例變量的其他方法時(shí)則不會(huì)發(fā)生問題泌霍。

class 
{
    return class_getSuperclass(object_getClass(self));
}

3. 重寫了delloc方法货抄,在合適的時(shí)候銷毀這個(gè)運(yùn)行時(shí)創(chuàng)建的類。

1.KVC與KVO的不同朱转?
KVC(鍵值編碼)蟹地,即Key-Value Coding,一個(gè)非正式的Protocol藤为,使用字符串(鍵)訪問一個(gè)對(duì)象實(shí)例變量的機(jī)制怪与。而不是通過調(diào)用Setter、Getter方法等顯式的存取方式去問缅疟。
KVO(鍵值監(jiān)聽)分别,即Key-Value Observing,它提供一種機(jī)制,當(dāng)指定的對(duì)象的屬性被修改后,對(duì)象就會(huì)接受到通知存淫,前提是執(zhí)行了setter方法耘斩、或者使用了KVC賦值。

2.和notification(通知)的區(qū)別桅咆?
notification比KVO多了發(fā)送通知的一步括授。兩者都是一對(duì)多,但是對(duì)象之間直接的交互,notification明顯得多荚虚,需要notificationCenter來做為中間交互薛夜。而KVO如我們介紹的,設(shè)置觀察者->處理屬性變化曲管,至于中間通知這一環(huán)却邓,則隱秘多了,只留一句“交由系統(tǒng)通知”院水,具體的可參照以上實(shí)現(xiàn)過程的剖析腊徙。
notification的優(yōu)點(diǎn)是監(jiān)聽不局限于屬性的變化,還可以對(duì)多種多樣的狀態(tài)變化進(jìn)行監(jiān)聽檬某,監(jiān)聽范圍廣撬腾,例如鍵盤、前后臺(tái)等系統(tǒng)通知的使用也更顯靈活方便恢恼。(參照通知機(jī)制第五節(jié)系統(tǒng)通知名稱內(nèi)容)

3.與delegate的不同民傻?
和delegate一樣,KVO和NSNotification的作用都是類與類之間的通信场斑。但是與delegate不同的是:
這兩個(gè)都是負(fù)責(zé)發(fā)送接收通知漓踢,剩下的事情由系統(tǒng)處理,所以不用返回值漏隐;而delegate 則需要通信的對(duì)象通過變量(代理)聯(lián)系喧半;
delegate一般是一對(duì)一,而這兩個(gè)可以一對(duì)多青责。

4.涉及技術(shù):
KVC/KVO實(shí)現(xiàn)的根本是Objective-C的動(dòng)態(tài)性和runtime挺据,以及訪問器方法的實(shí)現(xiàn);

總結(jié):
對(duì)比其他的回調(diào)方式脖隶,KVO機(jī)制的運(yùn)用的實(shí)現(xiàn)扁耐,更多的由系統(tǒng)支持,相比notification产阱、delegate等更簡潔些婉称,并且能夠提供觀察屬性的最新值以及原始值;但是相應(yīng)的在創(chuàng)建子類构蹬、重寫方法等等方面的內(nèi)存消耗是很巨大的酿矢。所以對(duì)于兩個(gè)類之間的通信,我們可以根據(jù)實(shí)際開發(fā)的環(huán)境采用不同的方法怎燥,使得開發(fā)的項(xiàng)目更加簡潔實(shí)用瘫筐。

另外需要注意的是,由于這種繼承方式的注入是在運(yùn)行時(shí)而不是編譯時(shí)實(shí)現(xiàn)的铐姚,如果給定的實(shí)例沒有觀察者策肝,那么KVO不會(huì)有任何開銷肛捍,因?yàn)榇藭r(shí)根本就沒有KVO代碼存在。但是即使沒有觀察者之众,委托和NSNotification還是得工作拙毫,這也是KVO此處零開銷觀察的優(yōu)勢。

異步:監(jiān)聽通知 主線程:發(fā)出通知 接收通知代碼在主線程
主線程:監(jiān)聽通知 異步:發(fā)出通知 接收通知代碼在異步
注意:在接收通知代碼中 可以加上主隊(duì)列任務(wù)
總結(jié):接收通知代碼 由 發(fā)出通知線程決定, KVO也一樣

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末棺禾,一起剝皮案震驚了整個(gè)濱河市缀蹄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌膘婶,老刑警劉巖缺前,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異悬襟,居然都是意外死亡衅码,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門脊岳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逝段,“玉大人,你說我怎么就攤上這事割捅∧糖” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵亿驾,是天一觀的道長嘹黔。 經(jīng)常有香客問我,道長颊乘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任醉锄,我火速辦了婚禮乏悄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘恳不。我一直安慰自己檩小,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布烟勋。 她就那樣靜靜地躺著规求,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卵惦。 梳的紋絲不亂的頭發(fā)上阻肿,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音沮尿,去河邊找鬼丛塌。 笑死较解,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赴邻。 我是一名探鬼主播印衔,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼姥敛!你這毒婦竟也來了奸焙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤彤敛,失蹤者是張志新(化名)和其女友劉穎与帆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體臊泌,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鲤桥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了渠概。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茶凳。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖播揪,靈堂內(nèi)的尸體忽然破棺而出贮喧,到底是詐尸還是另有隱情,我是刑警寧澤猪狈,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布箱沦,位于F島的核電站,受9級(jí)特大地震影響雇庙,放射性物質(zhì)發(fā)生泄漏谓形。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一疆前、第九天 我趴在偏房一處隱蔽的房頂上張望寒跳。 院中可真熱鬧,春花似錦竹椒、人聲如沸童太。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽书释。三九已至,卻和暖如春赊窥,著一層夾襖步出監(jiān)牢的瞬間爆惧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國打工锨能, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留检激,地道東北人肴捉。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像叔收,于是被迫代替她去往敵國和親齿穗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

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

  • 本文首發(fā)于 個(gè)人博客 KVO一直是IOS面試中的重點(diǎn)饺律,下面的面試題你碰到過嗎? KVO的底層是如何實(shí)現(xiàn)的窃页? add...
    Typeco閱讀 440評(píng)論 0 0
  • 前言 KVO這個(gè)在我們iOS實(shí)際項(xiàng)目中經(jīng)常用到的,今天我們來介紹一下它的原理复濒。 KVO的坑點(diǎn) 首先我們打開KVO官...
    似水流年_9ebe閱讀 975評(píng)論 2 9
  • 初探 Key-value observing is a mechanism that allows objects...
    xxxxxxxx_123閱讀 669評(píng)論 2 2
  • 前言 上一篇文章學(xué)習(xí)了KVC的原理(鍵值編碼)脖卖,KVC是由NSKeyValueCoding非正式協(xié)議啟用的一種機(jī)制...
    冼同學(xué)閱讀 647評(píng)論 0 3
  • 感覺很久都沒有寫新文章了,還是寫一些小文章吧巧颈,記錄一下也好畦木!這一次和大家講解的是KVO -- key value ...
    chouson_chan閱讀 364評(píng)論 0 1