前言
KVO對(duì)于每一名iOS開(kāi)發(fā)者而言基协,想必再熟悉不過(guò)了歌亲。你一定能熟練的寫(xiě)出KVO的日常三連:addObserver
、observeValueForKeyPath
澜驮、removeObserver
陷揪。可是,你真的了解KVO嗎悍缠?例如:KVO的底層是如何實(shí)現(xiàn)的卦绣?使用KVO有哪些風(fēng)險(xiǎn)?KVOController又是什么飞蚓?KVOController解決了原生KVO的哪些問(wèn)題滤港,又帶來(lái)了怎樣的風(fēng)險(xiǎn)?
接下來(lái)趴拧,我們不妨代入到具體的場(chǎng)景來(lái)看問(wèn)題:
場(chǎng)景一:Person使用KVO觀察Stock的屬性price溅漾。(Stock的實(shí)例對(duì)象由Person初始化,并被Person對(duì)象強(qiáng)持有)
下面這些問(wèn)題著榴,你能快速準(zhǔn)確的得出答案嗎添履?
如果使用KVC修改price屬性的值,Person可以觀察到price的變化嗎脑又?
如果price屬性是在Stock的分類(lèi)Stock+Balance中聲明的暮胧,Person可以觀察到price的變化嗎?
如果price不是Stock的一個(gè)屬性问麸,只是Stock中一個(gè)被聲明成Public的變量往衷,Person可以觀察到price的變化嗎?
添加觀察后严卖,對(duì)象stock的類(lèi)還是Stock嗎席舍?
當(dāng)price發(fā)生變化時(shí),消息是如何通知給Person的妄田?
另外:
KVO在iOS10及以下會(huì)出現(xiàn)哪些崩潰俺亮?分別是如何觸發(fā)的?
KVO在iOS11以以上還會(huì)出現(xiàn)上述6中的這些崩潰嗎疟呐?
KVOController會(huì)出現(xiàn)上述的崩潰嗎脚曾?它都做了哪些優(yōu)化?
KVOController又有哪些坑启具?
如果你能快速準(zhǔn)確的回答出上面的9個(gè)問(wèn)題本讥,那么恭喜你,你已經(jīng)對(duì)KVO了如指掌鲁冯,這篇文章并不是為你準(zhǔn)備的拷沸。但是如果你對(duì)于其中的部分問(wèn)題心存疑惑,那么不妨帶著問(wèn)題閱讀完下面的內(nèi)容薯演,相信你一定可以找到答案撞芍!
本文分別從KVO的使用、實(shí)現(xiàn)原理和隱患三方面來(lái)展開(kāi)跨扮,并在介紹完原生KVO的基礎(chǔ)上序无,從源碼實(shí)現(xiàn)的角度验毡,介紹開(kāi)源庫(kù)KVOController是如何解決原生隱患的,以及其不完美之處帝嗡。最后結(jié)合日常開(kāi)發(fā)中可能出現(xiàn)的實(shí)際情況晶通,介紹了該如何安全的使用KVOController。
原文地址 → 你的KVO用對(duì)了嗎
閱讀全文