第一、KVO
/**
KVO-----Key-Value Observing即鍵值監聽當指定對象的某個屬性發生改變時,對象就會接收到通知。
KVO與通知的區別:前者是被觀察者向觀察者發送通知,後者是一箇中心對象誒所有觀察者提供變更通知
*/
/**
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;
observe 觀察者
keyPath 監聽的屬性
option 獲得屬性的值
*/
/**
添加觀察者後要實現的方法
keyPath 監聽的屬性
change 屬性改變後的值
*/
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
if ([keyPath isEqualToString:@"text"]) {
NSLog(@"%@--%@",[change objectForKey:@"old"],[change objectForKey:@"new"]);
}
}
/**
移除觀察者,這一步必須要做。(添加觀察者和移除觀察者必須成對存在)
*/
-(void)dealloc{
[self.KVO_Lable removeObserver:self forKeyPath:@"text"];
}
第二、KVC
#pragma mark --- KVC
/**
KVC:Key-Value Coding,即鍵值編碼,我們可以動態設置對象的屬性的值。
如果動態設置屬性,系統優先調用setter方法,如果沒有實現setter方法則優先搜索成員變量即_屬性,如果仍然找不到的話直接搜索成員變量屬性,最後仍然搜不到的話調用setValue:forUndefineKey方法
如果是動態讀取屬性,則優先考慮getter方法,如果沒有實現getter方法則優先搜索成員變量_屬性,如果仍然不存在的話直接搜索成員變量屬性,最後仍然搜索不到則會調用valueforUndefinedKey:方法。
注意:搜索過程中不管這些方法、成員變量是私有還是公共的都可以被讀取,不會因爲是私有而導致失敗
value屬性值 keyPath複合路徑
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
value屬性值 key簡單路徑
- (void)setValue:(nullable id)value forKey:(NSString *)key;
複合路徑與簡單路徑的區別:簡單路徑只有一層(這個人的名字屬性),而複合路徑多層(這個人的狗屬性,狗仍然有名字屬性)。
*/
代碼傳送門:https://github.com/fuzongjian/KVOKVC.git