这是最近被刷屏的某2018 iOS面试题列表中的一题,值得一看。
KVO在Apple中的API文档如下:
Automatic key-value observing is implemented using a technique called isa-swizzling… When an observer is registered for an attribute of an object the isa pointer of the observed object is modified, pointing to an intermediate class rather than at the true class …
KVO基本原理
- KVO是基于runtime机制实现的。
- 当类的属性第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter 方法,并在setter方法内实现真正的通知机制。如果原类为Person,那么生成的派生类名为NSKVONotifying_Person。
- 每个类对象中都有一个isa指针指向当前类,当类对象的属性的第一次被观察,那么系统会将isa指针指向动态生成的派生类(NSKVONotifying_Person),从而在给被监控属性赋值时执行的是派生类的setter方法。
- 键值观察通知依赖于NSObject 的两个方法
willChangeValueForKey:
和didChangeValueForKey:
。在被观察属性发生改变之前,willChangeValueForKey:
会被调用,这就会记录旧的值。而当改变发生后,didChangeValueForKey:
会被调用,继而observeValueForKey:ofObject:change:context:
也会被调用。
具体流程如下:
可加群一起交流共同学习:801216530。