KVO是基于runtime機(jī)制實(shí)現(xiàn)的
當(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ī)制
如果原類為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ī)制中蘋果還偷偷重寫了class方法,讓我們誤認(rèn)為還是使用的當(dāng)前類咒唆,從而達(dá)到隱藏生成的派生類
KVO內(nèi)部實(shí)現(xiàn)原理.png