1、KVO的实现机制:
以下是苹果官方文档对KVO实现机制的解释: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
文档中唯一有用的信息也就是:被观察对象的 isa 指针会指向一个中间类,而不是原来真正的类。看来,Apple 并不希望过多暴露 KVO 的实现细节。不过,我们可以自己用 runtime 提供的方法去深入挖掘。
简单概括一下KVO的实现机制:
当你观察一个对象时,一个新的类会动态被创建。这个类继承自该对象的原本的类,并重写了被观察属性的 setter 方法。自然,重写的 setter 方法会负责在调用原 setter 方法之前和之后(在重写的set方法中调用- willChangeValueForKey:和- didChangeValueForKey:通知观察者),通知所有观察对象值的更改。最后把这个对象的 isa 指针 ( isa 指针告诉 Runtime 系统这个对象的类是什么 ) 指向这个新创建的子类,对象就神奇的变成了新创建的子类的实例。
2、KVO的使用步骤:
**注册需要观察的对象的属性addObserver:forKeyPath:options:context:
实现observeValueForKeyPath:ofObject:change:context:方法,这个方法当观察的属性变化时会自动调用
取消注册观察removeObserver:forKeyPath:context:**
实例分析:
被观察的类:Student
Student类只有一个属性String name
监听类:Teacher
只有一个属性:Student类的实例对象stu
在构造函数中初始化该属性,并为该属性的name属性增加监听
在析构函数中移除该监听
在测试类中进行测试观察:
测试结果:
结果分析:每次在被观察值变化时都会自动调用方法observeValueForKeyPath,可以在这个方法中观察该被观察值的变化前的量和变化后的量。