iOS 底层探索篇 ——KVO 底层原理
1. KVO
KVO(Key Value Observing, 键值观察)
是Objective-C对观察者模式的实现,每次当被观察对象的某个属性值发生改变
时,注册的观察者便能获得通知
。
1.1注册一个kvo
observer:
观察者 也就是被观察对象发生改变时通知的接收者keyPath
:被观察的属性名options
:参数 这里一般选择NSKeyValueObservingOptionNew
,NSKeyValueObservingOptionOld
。也就是在回调方法里会受到被观察属性的旧值和新值,默认为只接收新值。如果想在注册观察者后,立即
接收一次回调,则可以加入NSKeyValueObservingOptionInitial
枚举。context:
这个参数可以传入任意类型的对象
,这个值会传递到接收消息回调的代码中,是KVO中的一种传值
方式,可以当作标识符
用来区分观察到的属性。
1.2移除一个kvo
注意
- 移除观察者的时候如果他还没注册,那么就会报NSRangeException。注意要保持注册和移除的一对一关系,如果无法确定的话,就把removeObserver 放在try catch里面执行。
- kvo在dealloc的时候不会自动移除,被观察的对象会一直给观察者发消息,即使观察者已经被释放了。如果给被释放的观察者发消息,那么就会有内存访问的错误。所以要在释放观察者之前要移除kvo。
- protocols 没有提供询问物体是观察者还是被观察者的方法。为了避免释放的错误,一个典型的模式是在初始化的时候(例如在init或viewDidLoad中)注册为观察器,并在dealloc的时候移除观察者。要确保一个注册对应一个移除,并且确保观察者在被释放之前移除。
当这个对象没有移除观察者的时候,那么当self被释放
之后,那么student就还会继续给self发送消息
,这样就会导致崩溃
。
1.3手动和自动 kvo
automaticallyNotifiesObservers
是控制手动和自动kvo
的地方,当返回YES
时候就是自动
,返回NO
就是手动
。