iOS KVO底层实现原理
2020-03-04 本文已影响0人
出来遛狗了
很多人只知道怎么使用KVO,但是并不知道其中的实现原理,只知道是用runtime实现。但是面试的时候这种回答不是面试官想要的。所以写下这篇文章,希望迷惑的同学能深入了解KVO的底层实现原理。(ps: 属于个人总结,如果有不对的地方,请在评论里指出,谢谢)
首先我们为了实现KVO,我们新建一个Person类,包含了name属性。

我们在viewController中来监听name的改变

其实监听name的变化就是监听了setName方法。
接下来,我们就讲解一下,是怎么监听的setName的方法。
当我们给person添加observer时,其实系统帮我们创建了一个Person的子类NSKVONotifying_Person
通过将person对象的isa指向NSKVONotifying_Person

然后在NSKVONotifying_Person里面重写setName方法。
我们可以用伪代码的方式来解析重写的setName
在NSKVONotifying_Person中
- (void)setName:(NSString *)name{
[observe willChangeValueForKey:@"name"];
[super setName:name];
[observe didChangeValueForKey:@"name"];
[observe observeValueForKeyPath:key ofObject:self change:nil context:nil];
}
这样就能监听到name的变化了
以上就是我对KVO的解析了。