KVC-鍵值編碼(Key Value Coding)
- 動態設置:
-
setValue:屬性值 forKey:屬性名
(用于簡單路徑) -
setValue:屬性值 forKeyPath:屬性路徑
(用于復合路徑,例如Person有一個Account類型的屬性,那么person.account就是一個復合屬性)
-
- 動態讀取:
-
valueForKey:屬性名
(用于簡單路徑) -
valueForKeyPath:屬性名
(用于復合路徑)
-
KVC使用起來比較簡單,但是它是如何查找一個屬性進行讀取的呢?具體查找規則(假設現在要利用KVC對a屬性進行讀取):
- 如果是動態設置屬性,則優先考慮調用setA方法,如果沒有該方法則優先考慮搜索成員變量a,如果仍然不存在則搜索成員變量a,如果最后仍然沒搜索到則會調用這個類的
setValue:forUndefinedKey:
方法(注意搜索過程中不管這些方法、成員變量是私有的還是公有的都能正確設置_); - 如果是動態讀取屬性,則優先考慮調用a方法(a屬性的getter方法),如果沒有搜索到則會優先搜索成員變量a,如果仍然不存在則搜索成員變量a,如果最后仍然沒搜索到則會調用這個類的
valueforUndefinedKey:
方法(注意搜索過程中不管這些方法、成員變量是私有的還是公共的都能正確讀取_);
KVO-鍵值監聽(Key Value Observe)
在ObjC中使用KVO操作常用的方法如下:
- 注冊指定Key路徑的監聽器:
addObserver:forKeyPath:options:context:
- 刪除指定key路徑的監聽器:
removeObserver:forKeypath:
、removeObservser:forKeyPath:context:
; - 回調監聽:
observeValueForKeyPath:ofObject:change:context:
KVO的使用步驟也比較簡單:
- 通過
addObserver:forKeyPath:opetions:context:
為被監聽對象(通常是數據模型)注冊監聽器 - 重寫監聽器的
observeValueForKeyPath:ofObject:change:context:
方法
// cc監聽了aa的name屬性的改變
[aa addObserver:cc forKeyPath:@"name" options: NSKeyValueObservingOptionOld context:nil];
// cc得實現監聽方法
/**
* 當監聽到object的keyPath屬性發生了改變
*/
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"監聽到%@對象的%@屬性發生了改變, %@", object, keyPath, change);
}
區別與聯系
- KVC常見作用:給模型屬性賦值
- KVO常用作用:監聽模型屬性值的改變
- KVC是路徑訪問的規范,KVO是觀察某個變量的變化過程
- KVC/KVO類似于代理,通知中心。都是一種通訊方法。