Objective-C基礎之KVC,KVO

前言

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。

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