KVO內(nèi)部實(shí)現(xiàn)原理
-->KVO是基于runtime機(jī)制實(shí)現(xiàn)的
-->當(dāng)某個(gè)類的屬性對(duì)象第一次被觀察時(shí),系統(tǒng)就會(huì)在運(yùn)行期動(dòng)態(tài)地創(chuàng)建該類的一個(gè)派生類,在這個(gè)派生類中重寫(xiě)基類中任何被觀察屬性的setter 方法唉侄。派生類在被重寫(xiě)的setter方法內(nèi)實(shí)現(xiàn)真正的通知機(jī)制
-->如果原類為Person,那么生成的派生類名為NSKVONotifying_Person
-->每個(gè)類對(duì)象中都有一個(gè)isa指針指向當(dāng)前類歪赢,當(dāng)一個(gè)類對(duì)象的第一次被觀察慧瘤,那么系統(tǒng)會(huì)偷偷將isa指針指向動(dòng)態(tài)生成的派生類,從而在給被監(jiān)控屬性賦值時(shí)執(zhí)行的是派生類的setter方法
-->鍵值觀察通知依賴于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)用。
補(bǔ)充:KVO的這套實(shí)現(xiàn)機(jī)制中蘋果還偷偷重寫(xiě)了class方法亏狰,讓我們誤認(rèn)為還是使用的當(dāng)前類役纹,從而達(dá)到隱藏生成的派生類
KVO實(shí)現(xiàn)原理圖
如何手動(dòng)觸發(fā)一個(gè)value的KVO
-->自動(dòng)觸發(fā)的場(chǎng)景:在注冊(cè)KVO之前設(shè)置一個(gè)初始值,注冊(cè)之后骚揍,設(shè)置一個(gè)不一樣的值字管,就可以觸發(fā)了
-->想知道如何手動(dòng)觸發(fā),必須知道自動(dòng)觸發(fā) KVO 的原理信不,見(jiàn)上面的描述
-->手動(dòng)觸發(fā)演示