KVC與KVO
由于ObjC主要基于Smalltalk進行設(shè)計,因此它有很多類似于Ruby、Python的動態(tài)特性班眯,例如動態(tài)類型、動態(tài)加載烁巫、動態(tài)綁定等署隘,他們底層實現(xiàn)機制都是isa-swizzing。今天我們介紹ObjC中的 鍵值編碼Key Value Coding(KVC)亚隙、鍵值監(jiān)聽Key Value Observing(KVO)磁餐。
KVC
KVC的操作方法由NSKeyValueCoding協(xié)議提供,而NSObject就實現(xiàn)了這個協(xié)議阿弃,也就是說ObjC中幾乎所有的對象都支持KVC操作诊霹。
通常我們使用 語法和set方式更改對象的狀態(tài),即為對象賦值渣淳。
它是一種可以通過字符串的名字(key)來訪問類屬性的機制脾还,而不是通過調(diào)用Setter、Getter方法訪問入愧。(貌似說的有矛盾鄙漏,待思考解決)
- 動態(tài)設(shè)置: setValue:屬性值 forKey:屬性名(用于簡單路徑)、setValue:屬性值 forKeyPath:屬性路徑(用于復(fù)合路徑棺蛛,例如Person有一個Account類型的屬性怔蚌,那么person.account就是一個復(fù)合屬性)
- 動態(tài)讀取: valueForKey:屬性名 旁赊、valueForKeyPath:屬性名(用于復(fù)合路徑)
KVO
[p addObserver:<#(NSObject *)#> forKeyPath:<#(NSString *)#> options:<#(NSKeyValueObservingOptions)#> context:<#(void *)#>]
參數(shù)說明:
第一個參數(shù):監(jiān)聽器對象
第二個參數(shù):監(jiān)聽的屬性
第三個參數(shù):當屬性改變時桦踊,需要傳遞什么值給監(jiān)聽器(枚舉類型)
監(jiān)聽器需要實現(xiàn)監(jiān)聽方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
keypath:監(jiān)聽的屬性
object:誰的屬性改變了
change:改變的值或者原值 或者都是 在添加監(jiān)聽的options設(shè)置
移除監(jiān)聽器
但監(jiān)聽器是用完之后要進行移除
//刪除觀察者
[p removeObserver:self forKeyPath:@"name"];
(未完。彤恶。钞钙。)