KVO內部實現原理
-->KVO是基于runtime機制實現的
-->當某個類的屬性對象第一次被觀察時,系統就會在運行期動態地創建該類的一個派生類,在這個派生類中重寫基類中任何被觀察屬性的setter 方法。派生類在被重寫的setter方法內實現真正的通知機制
-->如果原類為Person,那么生成的派生類名為NSKVONotifying_Person
-->每個類對象中都有一個isa指針指向當前類,當一個類對象的第一次被觀察,那么系統會偷偷將isa指針指向動態生成的派生類,從而在給被監控屬性賦值時執行的是派生類的setter方法
-->鍵值觀察通知依賴于NSObject 的兩個方法: willChangeValueForKey: 和didChangevlueForKey:;在一個被觀察屬性發生改變之前, willChangeValueForKey: 一定會被調用,這就 會記錄舊的值。而當改變發生后,didChangeValueForKey: 會被調用,繼而 observeValueForKey:ofObject:change:context: 也會被調用。
補充:KVO的這套實現機制中蘋果還偷偷重寫了class方法,讓我們誤認為還是使用的當前類,從而達到隱藏生成的派生類
KVO實現原理圖
如何手動觸發一個value的KVO
-->自動觸發的場景:在注冊KVO之前設置一個初始值,注冊之后,設置一個不一樣的值,就可以觸發了
-->想知道如何手動觸發,必須知道自動觸發 KVO 的原理,見上面的描述
-->手動觸發演示