KVO底層原理

一莺治、概念定義

圖片.png

由官網(wǎng)文檔可見捂寿,通過對KVC的了解,也是對KVO的進(jìn)一步升華魁瞪。

  • KVO 是 Objective-C 對觀察者模式(Observer Pattern)的實現(xiàn)穆律。也是 Cocoa Binding 的基礎(chǔ)。當(dāng)被觀察對象的某個屬性發(fā)生更改時导俘,觀察者對象會獲得通知峦耘。

二、KVO初探

context

系統(tǒng)給的方法:

- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;

實際運(yùn)用中:
思考:context為什么用NULL類型而不是nil旅薄?


圖片.png

官方文檔說明:


圖片.png

思考:context到底要不要寫成NULL辅髓,有什么影響?設(shè)置它的值到底有什么意義呢少梁?


圖片.png

大致意思:您可以指定NULL并完全依賴鍵路徑字符串來確定更改通知的來源洛口,但是這種方法可能會給對象的父類帶來問題,該對象的超類也出于不同的原因而觀察相同的鍵路徑凯沪。
一種更安全第焰,更可擴(kuò)展的方法是使用上下文確保您收到的通知是發(fā)給觀察者的,而不是超類的妨马。

假如不需要context


圖片.png

此時就需要在

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context

這個方法中一層層的去判斷和識別要觀察的對象挺举,流程比較繁瑣

  • 由此可得出,對于復(fù)雜的情況烘跺,context的內(nèi)容還是一對一指定性的去設(shè)值湘纵,如果對于多個對象添加觀察都設(shè)置成NULL,則會造成數(shù)據(jù)混亂甚至崩潰液荸。(context相也當(dāng)于tag)
  • 好處:context用字符串直接來獲取匹配的方式瞻佛,更加直接,更加容易識別娇钱,更加便利伤柄,更加安全,性能更高

移除通知觀察(需不需要移除)
圖片.png

結(jié)論:如果不移除文搂,則會造成對象地址野指針适刀,所以一定要在跳轉(zhuǎn)頁面的時候移除當(dāng)前頁的KVO


嵌套路徑

自動和手動

核心代碼:


圖片.png

官方解釋:


圖片.png
  1. 自動
    核心代碼
// 自動開關(guān)
+ (BOOL) automaticallyNotifiesObserversForKey:(NSString *)key{
    return YES;  //啟動自動觀察
}
  1. 手動
    核心代碼
// 自動開關(guān)
+ (BOOL) automaticallyNotifiesObserversForKey:(NSString *)key{
    return NO; //關(guān)閉自動觀察,準(zhǔn)備手動觀察
}
圖片.png

可變數(shù)組
  • 類似電影或者音樂下載時候的進(jìn)度條煤蹭,多個下載任務(wù)時笔喉,會“實時”的把數(shù)據(jù)結(jié)果反饋給前一頁
    核心代碼:
    LGPerson.m


    圖片.png

    LGViewController.m


    圖片.png

    圖片.png

三取视、KVO實現(xiàn)原理

KVO是基于runtime機(jī)制實現(xiàn)的,KVO運(yùn)用了isa-swizzling技術(shù)常挚,isa-swizzling就是類型混合指針機(jī)制, 將2個對象的isa指針互相調(diào)換, 就是俗稱的黑魔法.


  • 當(dāng)某個類的屬性對象第一次被觀察時作谭,系統(tǒng)就會在運(yùn)行期動態(tài)地創(chuàng)建該類的一個派生類,在這個派生類中重寫基類中任何被觀察屬性的setter 方法奄毡。派生類在被重寫的setter方法內(nèi)實現(xiàn)真正的通知機(jī)制折欠。
  • 例如如果原類為Person,那么生成的派生類名為NSKVONotifying_Person
  • 每個類對象中都有一個isa指針指向當(dāng)前類吼过,當(dāng)一個類對象的第一次被觀察锐秦,那么系統(tǒng)會偷偷將isa指針指向動態(tài)生成的派生類,從而在給被監(jiān)控屬性賦值時執(zhí)行的是派生類的setter方法
  • 鍵值觀察通知依賴于NSObject 的兩個方法: willChangeValueForKey: 和 didChangevlueForKey:盗忱;在一個被觀察屬性發(fā)生改變之前酱床, willChangeValueForKey:一定會被調(diào)用,這就 會記錄舊的值趟佃。而當(dāng)改變發(fā)生后扇谣,didChangeValueForKey:會被調(diào)用,繼而 observeValueForKey:ofObject:change:context: 也會被調(diào)用揖闸。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末揍堕,一起剝皮案震驚了整個濱河市料身,隨后出現(xiàn)的幾起案子汤纸,更是在濱河造成了極大的恐慌,老刑警劉巖芹血,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贮泞,死亡現(xiàn)場離奇詭異,居然都是意外死亡幔烛,警方通過查閱死者的電腦和手機(jī)啃擦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饿悬,“玉大人令蛉,你說我怎么就攤上這事〗铺瘢” “怎么了珠叔?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長弟劲。 經(jīng)常有香客問我祷安,道長,這世上最難降的妖魔是什么兔乞? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任汇鞭,我火速辦了婚禮凉唐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘霍骄。我一直安慰自己台囱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布读整。 她就那樣靜靜地躺著玄坦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绘沉。 梳的紋絲不亂的頭發(fā)上从铲,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機(jī)與錄音匀归,去河邊找鬼约啊。 笑死,一個胖子當(dāng)著我的面吹牛另玖,可吹牛的內(nèi)容都是我干的困曙。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼谦去,長吁一口氣:“原來是場噩夢啊……” “哼慷丽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鳄哭,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤要糊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后妆丘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锄俄,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年勺拣,在試婚紗的時候發(fā)現(xiàn)自己被綠了奶赠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡药有,死狀恐怖毅戈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情愤惰,我是刑警寧澤苇经,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站羊苟,受9級特大地震影響塑陵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜡励,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一令花、第九天 我趴在偏房一處隱蔽的房頂上張望阻桅。 院中可真熱鬧,春花似錦兼都、人聲如沸嫂沉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趟章。三九已至,卻和暖如春慎王,著一層夾襖步出監(jiān)牢的瞬間蚓土,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工赖淤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜀漆,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓咱旱,卻偏偏與公主長得像确丢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吐限,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

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

  • 上半年有段時間做了一個項目鲜侥,項目中聊天界面用到了音頻播放,涉及到進(jìn)度條诸典,當(dāng)時做android時候處理的不太好描函,由于...
    DaZenD閱讀 3,013評論 0 26
  • 前言 KVO作為iOS一個設(shè)計模式,監(jiān)聽對象屬性變化搂赋。通過屬性變化來做出一些處理赘阀。那么KVO底層原理是什么益缠?相信大...
    楓葉無處漂泊閱讀 799評論 0 2
  • 本文分為2個部分:概念與應(yīng)用脑奠。概念部分旨在剖析 KVO 這一設(shè)計模式的實現(xiàn)原理;應(yīng)用部分通過創(chuàng)建的項目幅慌,以說明 K...
    啊左閱讀 57,571評論 107 438
  • iOS--KVO的實現(xiàn)原理與具體應(yīng)用 長時間不用容易忘,這篇文章挺好的.轉(zhuǎn)載自看本文分為2個部分:概念與應(yīng)用宋欺。概念...
    超_iOS閱讀 1,435評論 0 17
  • 1、如何拆分表胰伍,怎么分表齿诞,怎么分庫?怎么保證一致性骂租? 2祷杈、網(wǎng)關(guān)是做什么的? 3渗饮、怎么抗高并發(fā)但汞? 4宿刮、綁卡整體流程,...
    hedgehog1112閱讀 179評論 0 0