说到KVO(Key-Value-Observe),相信每个人都知道,具体用法肯定也是滚瓜烂熟。那么KVO的实现原理是怎样的呢?
我们就来举一个例子,来说明一个它的具体实现过程:
一、新建两个类:Person 和 Dog
二、给Dog添加一个属性age
三、初始化Person对象和Dog对象,给person对象添加对Dog对象age的观察
四、Person中实现方法
最后、改变age值,进行验证
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
其具体实现代码如下:
self.person = [[Person alloc]init];
self.dog = [[Dog alloc]init];
[self.dog addObserver:self.person forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];
这个时候我们执行
self.dog.age = 19;
就会发现Person类中的以下方法调用
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
NSLog(@"检测到了%@发生了变化 %@----%@------%@",keyPath,object,change,context);
}
上面说了这么多,其实只涉及到用法,那么KVO的实现原理到底是怎样的呢?
1、其实当某个类的某个属性被注册监听的时候,系统会隐性的创建一个这个类的子类,以NSKVONotifying_+(当前类名)。
对应到Dog类就是NSKVONotifying_Dog。
2、在NSKVONotifying_Dog类实现中实现方法setAge,调用willChangeValueForKey和didChangeValueForKey方法
#import "NSKVONotifying_Dog.h"
@implementation NSKVONotifying_Dog
-(void)setAge:(int)age{
[super setAge:age];
[self willChangeValueForKey:@"age"];
[self didChangeValueForKey:@"age"];
}
@end
这两个方法的作用是触发
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
方法执行。
网友评论