KVC 鍵值編碼
使用字符串直接訪問對象的屬性
底層實現(xiàn)遥诉,當(dāng)一個對象調(diào)用setValue方法時,方法內(nèi)部會做以下操作:
1、檢查是否存在相應(yīng)key的set方法,如果存在鹰溜,就調(diào)用set方法
2凉馆、如果set方法不存在戚哎,就會查找與key相同名稱并且?guī)聞澗€的成員屬性味赃,如果有,則直接給成員屬性賦值滔悉。
3伊诵、如果沒有找到_key,就會查找相同的屬性key氧敢,如果有就直接賦值日戈。
4、如果沒有找到孙乖,則調(diào)用valueForUndefinedKey: 和 setValue:forUndefinedKey: 方法
KVO 實現(xiàn)原理
如何手動觸發(fā)KVO方法浙炼?
手動調(diào)用willChangeValueForKey 和 didChangeValueForKey 方法
鍵值觀察通知依賴于NSObject的兩個方法:willChangeValueForKey: 和 didChangeValueForKey。在一個被觀察屬性發(fā)生改變之前唯袄,willChangeValueForKey 會被調(diào)用弯屈,這就會記錄舊的值。而當(dāng)前發(fā)生后恋拷,didChangeValueForKey 會被調(diào)用资厉,繼而observeValueForKey:ofObject:change:context:也會被調(diào)用。如果可以手動實現(xiàn)這些調(diào)用蔬顾,就可以實現(xiàn)”手動觸發(fā)“了宴偿。有人可能會問只調(diào)用didChangeValueForKey方法可以觸發(fā)KVO方法,其實是不能的诀豁。因為willChangeValueForKey: 記錄舊的值窄刘,如果不記錄舊的值,那就沒有改變一說
KVO - 鍵值觀察機制舷胜,原理如下:
1.當(dāng)給A類添加KVO的時候娩践,runtime動態(tài)的生成了一個子類NSKVONotifying_A,讓A類的isa指針指向NSKVONotifying_A類烹骨,重寫class方法翻伺,隱藏對象真實類信息
2.重寫監(jiān)聽屬性的setter方法,在setter方法內(nèi)部調(diào)用了Foundation 的 _NSSetObjectValueAndNotify 函數(shù)
3._NSSetObjectValueAndNotify函數(shù)內(nèi)部
a) 首先會調(diào)用 willChangeValueForKey
b) 然后給屬性賦值
c) 最后調(diào)用 didChangeValueForKey
d) 最后調(diào)用 observer 的 observeValueForKeyPath 去告訴監(jiān)聽器屬性值發(fā)生了改變 .
4.重寫了dealloc做一些 KVO 內(nèi)存釋放