為什么說KVO是基于KVC實現的

為什么說KVO是基于KVC實現的

在閱讀本篇文章之前,需要你了解KVC和KVO的基本實現,如不清楚,可先閱讀下面兩篇文檔KVC的基本使用KVO的基本使用

在學習KVO的時候,看很多文章都說KVO是基于KVC實現的

KVO實現原理(只針對普通對象,不包括集合)

  1. 當某個類的屬性被觀察時,系統會在運行時動態的創建一個該類的子類。并且把改對象的isa指向這個子類

  2. 假設被觀察的屬性名是name,若父類里有setName:或這_setName:,那么在子類里重寫這2個方法,若2個方法同時存在,則只會重寫setName:一個(這里和KVCset時的搜索順序是一樣的)

  3. 若被觀察的類型是NSString,那么重寫的方法的實現會指向_NSSetObjectValueAndNotify這個函數,這個函數里會調用willChangeValueForKey:didChangevlueForKey:,并且會在這2個方法調用之間,調用父類set方法的實現

  4. 系統會在willChangeValueForKey:對observe里的change[old]賦值,取值是用valueForKey:取值的,didChangevlueForKey:對observe里的change[new]賦值,然后調用observe的這個方法- (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary<NSKeyValueChangeKey, id> *)change context:(nullable void *)context;

  5. 當使用KVC賦值的時候,在NSObject里的setValue:forKey:方法里,若父類不存在setName:或這_setName:這些方法,會調用_NSSetValueAndNotifyForKeyInIvar這個函數,這個函數里同樣也會調用willChangeValueForKey:didChangevlueForKey:,若存在則調用

為什么說KVO基于KVC實現的

  1. 當使用KVO觀察某個類屬性時,會為該類創建一個子類,子類重寫setter方法時,跟KVCset時的搜索順序是一樣的,都是先搜索set<Key>,然后在搜_set<Key>。對于KVC,若不存在會有后續操作,參考上面的文檔

  2. 在為observe的change字典里的old和new賦值時,用到了KVC的valueForKey:

  3. 也許是蘋果在KVO文檔里的這句話。為了理解KVO,你首先要理解KVC

Important: In order to understand key-value observing, you must first understand key-value coding.

參考

  1. https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/KeyValueCoding/BasicPrinciples.html
  2. https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • KVC KVC定義 KVC(Key-value coding)鍵值編碼,就是指iOS的開發中,可以允許開發者通過K...
    jackyshan閱讀 51,949評論 9 200
  • KVC KVC定義 KVC(Key-value coding)鍵值編碼,就是指iOS的開發中,可以允許開發者通過K...
    暮年古稀ZC閱讀 2,173評論 2 9
  • 1.ios高性能編程 (1).內層 最小的內層平均值和峰值(2).耗電量 高效的算法和數據結構(3).初始化時...
    歐辰_OSR閱讀 29,591評論 8 265
  • KVC(Key-value coding)鍵值編碼,單看這個名字可能不太好理解。其實翻譯一下就很簡單了,就是指iO...
    我的夢工廠閱讀 901評論 1 8
  • 在馬蜂窩上定了當地一日游,因為去看薰衣草的路線沒有公共交通,包了個小團,國內的司機兼導游。同行的三口之家,孩子在德...
    風0420閱讀 267評論 0 2