1.KVC實現原理
- KVC,鍵值編碼,使用字符串直接訪問對象的屬性;
- 底層實現,當一 個對象調用setValue方法時,方法內部會做一下操作:
(1)檢查是否存在相應key的set方法,如果存在,就調用set方法;
(2)如果set方法不存在,就會查找與key相同名稱且帶下劃線的成員屬性,如果有,則直接給成員屬性賦值;
(3)如果沒有找到_key,就會查找相同名稱的屬性key。如果有,就直接賦值;
(4)如果還沒有找到,則會調用valueForUndefinedKey:和setValue:forUndefinedKey:方法
2.KVO的實現原理
KVO-鍵值觀察機制,原理如下:
1、當給A類添加KVO的時候,runtime動態的生成了一個子類NSKVONotifying_A,讓A類的isa指針指向NSKVONotifying_A類,重寫 class方法,隱藏對象的真實類信息;
2、重寫堅聽屬性的setter方法,在setter方法內部調用了Foundation的_NSSetObjectValueAndNotiify函數;
3、_NSSetObectValueAndNotify函數內部過程:
(a)首先會調用willChangeValueForKey;
(b)給屬性賦值;
(c)調用diddChangeValueForKey;
(d)調用observer的observerValueForKeyPath去通知監聽屬性值發生了變化
4、重寫dealloc,釋放KVO 的內存
3.如何手動觸發KVO方法
手動調用willChangeValueForKey 和didChangeValueForKey.
鍵值觀察通知依賴於 NSObject 的兩個方法: willChangeValueForKey: 和 didChangeValueForKey。在一個被觀察屬性發生改變之前, willChangeValueForKey: 一定會被調用,這就 會記錄舊的值。而當改變發生後, didChangeValueForKey 會被調用,繼而 observeValueForKey:ofObject:change:context: 也會被調用。如果可以手動實現這些調用,就可以實現“手動觸發”了 有人可能會問只調用didChangeValueForKey方法可以觸發KVO方法,其實是不能的,因爲willChangeValueForKey: 記錄舊的值,如果不記錄舊的值,那就沒有改變一說了