KVO基本概念:主要用來監(jiān)聽某個對象的某個屬性的變化藕帜,當(dāng)發(fā)生變化的時候讲岁,觀察者會調(diào)用對應(yīng)的函數(shù)庵朝,實現(xiàn)對應(yīng)的功能芬迄。
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方法烦秩,讓我們誤認(rèn)為還是使用的當(dāng)前類,從而達到隱藏生成的派生類
以下是圖解釋: