前言
KVC、KVO跟Objective-C中的屬性操作相關,這篇文章簡單的梳理了它們的概念與用法,參考文章《iOS開發系列–Objective-C之KVC、KVO》
正文
KVC
在java中如果想要通過字符串來實現對象屬性的讀寫操作,那麼必須要用到反射,而Objective-C中可以使用KVC來實現它
important note : KVC的操作方法由NSKeyValueCoding協議提供,而NSObject就實現了這個協議,也就是說ObjC中幾乎所有的對象都支持KVC操作
KVC常用的操作方法
- 動態設置: setValue:屬性值 forKey:屬性名(用於簡單路徑)、
- 動態設置:setValue:屬性值 forKeyPath:屬性路徑(用於複合路徑,例如Person有一個Account類型的屬性,那麼person.account就是一個複合屬性)
- 動態讀取: valueForKey:屬性名 、valueForKeyPath:屬性名(用於複合路徑)
KVC的讀寫規則
- 如果是動態設置屬性,則優先考慮調用setA方法,如果沒有該方法則優先考慮搜索成員變量_a,如果仍然不存在則搜索成員變量a,如果最後仍然沒搜索到則會調用這個類的setValue:forUndefinedKey:方法(注意搜索過程中不管這些方法、成員變量是私有的還是公共的都能正確設置);
- 如果是動態讀取屬性,則優先考慮調用a方法(屬性a的getter方法),如果沒有搜索到則會優先搜索成員變量_a,如果仍然不存在則搜索成員變量a,如果最後仍然沒搜索到則會調用這個類的valueforUndefinedKey:方法(注意搜索過程中不管這些方法、成員變量是私有的還是公共的都能正確讀取);
KVO
KVO可以實現數據模型修改了之後會立即反映到UI視圖上這個功能
在ObjC中使用KVO操作常用的方法如下:
- 註冊指定Key路徑的監聽器: addObserver: forKeyPath: options: context:
- 刪除指定Key路徑的監聽器: removeObserver: forKeyPath、removeObserver: forKeyPath:
context: - 回調監聽: observeValueForKeyPath: ofObject: change: context:
KVO的使用步驟也比較簡單:
- 通過addObserver: forKeyPath: options: context:爲被監聽對象(它通常是數據模型)註冊監聽器
- 重寫監聽器的observeValueForKeyPath: ofObject: change: context:方法
important note : 在ObjC中要實現KVO則必須實現NSKeyValueObServing協議,不過幸運的是NSObject已經實現了該協議,因此幾乎所有的ObjC對象都可以使用KVO。