上一篇關(guān)于KVC的講解中我們說到了KVC提供了一種通過key來訪問類的屬性以及成員變量的機制名斟。今天要說的KVO是提供model層與view層數(shù)據(jù)綁定的一種機制,要理解KVO首先必須得理解KVC。
KVO實現(xiàn)的原理
- KVO是基于runtime機制實現(xiàn)的
- 當(dāng)某個類的屬性第一次被觀察時膨疏,系統(tǒng)就會在運行期動態(tài)地創(chuàng)建該類的一個派生類鬓照,在這個派生類中重寫基類中任何被觀察屬性的setter 方法。派生類在被重寫的setter方法內(nèi)實現(xiàn)真正的通知機制
如果原類為Person秽之,那么生成的派生類名為NSKVONotifying_Person
每個類對象中都有一個isa指針指向當(dāng)前類当娱,當(dāng)一個類對象的第一次被觀察,那么系統(tǒng)會偷偷將isa指針指向動態(tài)生成的派生類考榨,從而在給被監(jiān)控屬性賦值時執(zhí)行的是派生類的setter方法
鍵值觀察通知依賴于NSObject 的兩個方法: willChangeValueForKey: 和 didChangevlueForKey:跨细;在一個被觀察屬性發(fā)生改變之前, willChangeValueForKey:一定會被調(diào)用河质,這就 會記錄舊的值冀惭。而當(dāng)改變發(fā)生后,didChangeValueForKey:會被調(diào)用掀鹅,繼而 observeValueForKey:ofObject:change:context: 也會被調(diào)用散休。 - KVO的這套實現(xiàn)機制中蘋果還偷偷重寫了class方法,讓我們誤認為還是使用的當(dāng)前類乐尊,從而達到隱藏生成的派生類戚丸。
備注: 詳細的也可以看看這篇博文,本文的原理解析部分出自此文章。結(jié)合文章的解釋再去看官方文檔的說明就恍然大悟了扔嵌。