什么是KVO机制
KVO,全称是key_value_Observing,是ios中的一种设计模式,名为观察者模式,用于检测对象的某些属性的实时变化情况并作出响应。依赖于runtime的动态机制。
观察者模式的定义:一个目标对象管理所有依赖于它的观察者对象,并在它自身的状态改变时主动通知观察者对象。这个主动通知通常是通过调用各观察者对象所提供的接口方法来实现的。观察者模式较完美地将目标对象与观察者对象解耦。
KVO的底层实现分析
系统实现KVO有以下几个步骤:
1.当类A的对象第一次被观察的时候,系统会在运行期动态创建类A的派生类。我们称为B。
2.在派生类B中重写类A的setter方法,B类在被重写的setter方法中实现通知机制。
3.类B重写会 class方法,将自己伪装成类A。类B还会重写dealloc方法释放资源。
4.系统将所有指向类A对象的isa指针指向类B的对象
通俗一点的说法是:当注册观察者的时候做的事情:
1.动态的创建一个叫NSKVONotifying_Person的子类
2.更改之前类的 isa指针为子类
3.传入一堆参数 1.监听者(将来调用observeValueForKeyPath) 2.keypath(决定了重写哪个set方法) 3.枚举(决定传哪些给你) 4.携带参数
4.根据keypath 重写子类的set方法
NSKVONotifying_Person类中setter方法
在生成的NSKVONotifying_Person的setter方法中,主要是实现了以下方法
[super setWeight:weight];
//这两个方法会调用监听者的监听者方法
[self willChangeValueForKey:@"weight"];
[self didChangeValueForKey:@"weight"];
在子类的setter方法中,根据枚举保存所有的属性值,然后调用父类setter方法,然后调用监听者的observeValueForKeyPath,把对应的值传出去通知监听者发生了什么事情。所以不能依靠isa指针来确定对象是否是一个类的成员。应该使用class方法来确定对象实例的类。
参考链接:
https://www.cnblogs.com/cleven/p/5468853.html
https://www.jianshu.com/p/67fb22783771
网友评论