概述
KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则其观察者就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。
KVO其实也是“观察者”设计模式的一种应用。这种模式有利于两个类间的解耦合,尤其是对于 业务逻辑与视图控制 这两个功能的解耦合。
KVO 的具体使用
/**
KVO是监听对象的属性值的改变的
@param self.person 被检测的对象
@param self 检测的对象
@param @"name" 要监控的属性
@param options: 设置通知类型
*/
[self.person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
//被检查对象的值发生改变会调用该方法,这个方法属于 NSObject 类的,任何对象都可以作为观察者,
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
NSLog(@"监听到了%@的%@属性发生了改变", object, keyPath);
NSLog(@"%@", change);
}
KVO 的实现原理
KVO 是基于运行时实现的
isa Class NSKVONotifying_Person 0x000001a12de2f545
上述例子中,当 person.name 的值改变时, person对象的 isa 指针会指向 NSKVONotifying_Person,意味着,在程序运行时,会动态生成一个 NSKVONotifying_Person 类,该类继承于 Person,而且该类中也有个 -setName: 方法,方法中在设置 name 的同时实现了:
- (void)setName:(NSString *)name
{
[super setName:name];
// 这两个方法底层会调用observer的- (void)observeValueForKeyPath: ofObject: change: context:这个方法
[self willChangeValueForKey:@"name"];
[self didChangeValueForKey:@"name"];
}
网友评论