KVO內(nèi)部實現(xiàn)原理
KVO是基于runtime機制實現(xiàn)的
當某個類的屬性對象第一次被觀察時验懊,系統(tǒng)就會在運行期動態(tài)地創(chuàng)建該類的一個派生類卵皂,在這個派生類中重寫基類中任何被觀察屬性的setter 方法。派生類在被重寫的setter方法內(nèi)實現(xiàn)真正的通知機制
如果原類為Person真屯,那么生成的派生類名為NSKVONotifying_Person
每個類對象中都有一個isa指針指向當前類,當一個類對象的第一次被觀察获列,那么系統(tǒng)會偷偷將isa指針指向動態(tài)生成的派生類,從而在給被監(jiān)控屬性賦值時執(zhí)行的是派生類的setter方法
鍵值觀察通知依賴于NSObject 的兩個方法: willChangeValueForKey: 和 didChangevlueForKey:蛔垢;在一個被觀察屬性發(fā)生改變之前蛛倦, willChangeValueForKey:一定會被調(diào)用,這就 會記錄舊的值啦桌。而當改變發(fā)生后溯壶,didChangeValueForKey:會被調(diào)用,繼而 observeValueForKey:ofObject:change:context: 也會被調(diào)用甫男。
原地址