iOS之KVC KVO

A訫飛Flyme發表於2017-12-20

#KVC與KVO 由於ObjC主要基於Smalltalk進行設計,因此它有很多類似於Ruby、Python的動態特性,例如動態型別、動態載入、動態繫結等,他們底層實現機制都是isa-swizzing。今天我們介紹ObjC中的 鍵值編碼Key Value Coding(KVC)、鍵值監聽Key Value Observing(KVO)。 ##KVC KVC的操作方法由NSKeyValueCoding協議提供,而NSObject就實現了這個協議,也就是說ObjC中幾乎所有的物件都支援KVC操作。 通常我們使用 語法和set方式更改物件的狀態,即為物件賦值。 它是一種可以通過字串的名字(key)來訪問類屬性的機制,而不是通過呼叫Setter、Getter方法訪問。(貌似說的有矛盾,待思考解決)

  • 動態設定: setValue:屬性值 forKey:屬性名(用於簡單路徑)、setValue:屬性值 forKeyPath:屬性路徑(用於複合路徑,例如Person有一個Account型別的屬性,那麼person.account就是一個複合屬性)
  • 動態讀取: valueForKey:屬性名 、valueForKeyPath:屬性名(用於複合路徑)

##KVO

[p addObserver:<#(NSObject *)#> forKeyPath:<#(NSString *)#> options:<#(NSKeyValueObservingOptions)#> context:<#(void *)#>]
引數說明:
第一個引數:監聽器物件
第二個引數:監聽的屬性
第三個引數:當屬性改變時,需要傳遞什麼值給監聽器(列舉型別)
監聽器需要實現監聽方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
keypath:監聽的屬性
object:誰的屬性改變了
change:改變的值或者原值  或者都是  在新增監聽的options設定
移除監聽器
但監聽器是用完之後要進行移除
//刪除觀察者
[p removeObserver:self forKeyPath:@"name"];
複製程式碼

(未完。。。)

相關文章