kvo总结
问题:iOS用什么方式实现一个KVO?(KVO的本质是什么)
答:
利用RuntimeAPI动态生成一个子类,并且让instance对象的isa指向这个全新的子类
当修改instance对象的属性时,会调用Foundation的_NSSetXXXValueAndNotify函数
willChangeValueForKey:
父类原来的setter
didChangeValueForKey:
内部会触发监听器(Oberser)的监听方法( observeValueForKeyPath:ofObject:change:context:)
问题:如何手动触发KVO?
答:我们一般是调用set方法赋值,从而自动触发KVO。
手动调用其实是调用willChangeValueForKey和didChangeValueForKey方法
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// [self.person1 setAge:21];
// [self.person2 setAge:22];
//手动调用KVO
[self.person1 willChangeValueForKey:@"age"];
[self.person1 didChangeValueForKey:@"age"];
}
我们把set方法注释调换成手动调用模式,发现也能触发KVO收到回调。willChangeValueForKey和didChangeValueForKey必须同时调用,缺一不可。
问题:直接修改成员变量会触发KVO么?
答:不会触发KVO,因为没有调用setter方法。因为KVO的本质是重写set方法,然后在set方法里依次调用willChangeValueForKey,原来的set方法,didChangeValueForKey,didChangeValueForKey内部会调用observer的observeValueForKeyPath: ofObject: change: context:方法
网友评论