作者:Mitchell
一 、简介
- 全称:Key Value Observing(键值监听),也就是每次对象的属性被改变后,那么监听者就会接到通知,是一个很常用的开发模式。
二、作用
- 监听模型的属性值的改变
三、步骤
- 添加监听器
// 利用b对象来监听a对象name属性的改变 [a addObserver:b forKeyPath:@"name" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:@"test"];
- 在监听器中实现监听方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { NSLog(@"%@ %@ %@ %@", object, keyPath, change, context); }
- 选择不监听某个属性
//通知 key 的观察者
+(BOOL)automaticallyNotifiesObserversForKey:(NSString *)key{
//不观察这个 key
if ([key isEqualToString:@"link"]) {
return NO;
}
//调用系统的方法
return [super automaticallyNotifiesObserversForKey:key];
}
四、KVO 实现原理
- 根据苹果文档中的话:
自动的键值观察技术使用 isa-swizzling 的技术来实现。当一个观察者开始观察一个对象的属性的时候,被观察对象的 isa 指针就被修改了,指向了一个中间类而不是原来的类。
- 简单叙述 KVO 的实现,当观察一个对象的时候,一个新的类会被动态创建出来。这个类继承自该对象的原本的类,并重写了被观察属性的 setter 方法。新的方法会在原来的 setter 方法之前和之后,通知所有观察对象值的更改。然后把这个对象的 isa 指针指向这个中间类。不仅如此,苹果还重写了-class 的方法,让开发者看起来使用的仍旧是原来的类。
参考链接:如何自己动手实现 KVO