KVC: key value coding,鍵值編碼.是一種通過使用屬性的名稱(key)來間接訪問對象屬性的方法.這個方法可以不用通過 setter/getter 方法來訪問對象的屬性.該方法使用的實質是,是使用 valueForKey來代替 getter 方法, setValueForKey 來代 ...
KVC:
key value coding,鍵值編碼.是一種通過使用屬性的名稱(key)來間接訪問對象屬性的方法.這個方法可以不用通過 setter/getter 方法來訪問對象的屬性.該方法使用的實質是,是使用 valueForKey來代替 getter 方法, setValueForKey 來代替 setter 方法.
KVC 常用的方法:
- (id)ValueForKey: 通過 key 值讀取對象的屬性
-(id)setValue: forKey: 通過 key 的值來使用屬性
-(id)setNilValueForKey: 將給的 key 字對應的 value 值設置為 nil
-(id)setValueForUndefinedKey: 錯誤攔截,在 KVC 沒有找到 key 值時調用.
KVC 的特點:
- 既可以取值也可以賦值.
- KVC 是一種間接傳值,該方式有利於解耦合.
- KVC 可以對只讀屬性/私有屬性賦值
- KVC 有自動裝箱(自動類型轉換)的功能.
- 支持鍵值路徑
鍵值路徑:說白了就是對嵌套比較深的key 取值.主要表現在兩個方法之間的區別setValue: forKey: 和 setValue: forKeyPath:
setValue: forKey: 方法,在使用的時候只是在本層中查找 key 值進行賦
setValue: forKeyPath: 方法在使用的時候,根據傳進來的 key 值在整個項目中查找.直到查找到該 key 值後對其賦值.
- KVC提供了avg,sum,max,min,count 等函數,在可以直接使用
KVC 的缺點
- 由於 KVC 是通過 key 字元串進行屬性的訪問的,所以編譯器無法檢測說給的 key 值的正確性
- KVC 的執行效率要比 setter 和 getter 方法的低,因為 KVC 要先解析說給的 key 值,然後才去訪問對應的屬性.
KVC 的實現原理:
KVC 首先根據傳入的 anyKey(以此 key 為例)值去查找對象中是否含有anyKey的方法,找到了就直接使用,如果沒有找到就繼續查找是否含有anyKey的屬性,找到的話直接使用,如果沒有找到,則試圖調用 setValueForUndefineKey,如果該方法沒有實現,則會報錯.
註: KVC 查找anyKey的方法和屬性的時候,不僅僅查找anyKey,還會查找 _anyKey , getAnyKey 和 _getAnyKey
KVO:
Key value observing,鍵值監聽,通俗點說就是當指定的對象的屬性改變的時候,對象就會接到通知.也就是說,每次指定的對象發生改變的時候,對應的監聽者就會接收到信息.
KVO 的使用原理:
KVO:鍵值監聽.是 cocoa 框架實現的觀察者模式,一般和 KVC 搭配使用.通過 KVO 可以監測一個值的變化.是一個一對多的關係,即一個值發生了變化,會通知所有的觀察者.
KVO 的使用方法:
- 註冊
- 使用回調方法.
- 移除觀察者