作者:Mitchell
一 陪竿、簡介
- 全稱:Key Value Observing(鍵值監(jiān)聽),也就是每次對象的屬性被改變后简卧,那么監(jiān)聽者就會接到通知兔魂,是一個很常用的開發(fā)模式。
二贞滨、作用
- 監(jiān)聽模型的屬性值的改變
三入热、步驟
- 添加監(jiān)聽器
// 利用b對象來監(jiān)聽a對象name屬性的改變 [a addObserver:b forKeyPath:@"name" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:@"test"];
- 在監(jiān)聽器中實現監(jiān)聽方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { NSLog(@"%@ %@ %@ %@", object, keyPath, change, context); }
- 選擇不監(jiān)聽某個屬性
//通知 key 的觀察者
+(BOOL)automaticallyNotifiesObserversForKey:(NSString *)key{
//不觀察這個 key
if ([key isEqualToString:@"link"]) {
return NO;
}
//調用系統(tǒng)的方法
return [super automaticallyNotifiesObserversForKey:key];
}
四、KVO 實現原理
- 根據蘋果文檔中的話:
自動的鍵值觀察技術使用 isa-swizzling 的技術來實現晓铆。當一個觀察者開始觀察一個對象的屬性的時候勺良,被觀察對象的 isa 指針就被修改了,指向了一個中間類而不是原來的類骄噪。
- 簡單敘述 KVO 的實現尚困,當觀察一個對象的時候,一個新的類會被動態(tài)創(chuàng)建出來链蕊。這個類繼承自該對象的原本的類事甜,并重寫了被觀察屬性的 setter 方法。新的方法會在原來的 setter 方法之前和之后滔韵,通知所有觀察對象值的更改逻谦。然后把這個對象的 isa 指針指向這個中間類。不僅如此陪蜻,蘋果還重寫了-class 的方法邦马,讓開發(fā)者看起來使用的仍舊是原來的類。
參考鏈接:如何自己動手實現 KVO