iOS基礎總結一(KVC、KVO簡述)

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: 記錄舊的值,如果不記錄舊的值,那就沒有改變一說了

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章