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就是手动。

本文深入探讨了iOS中的Key-Value Observing(KVO)技术,包括注册和移除KVO、手动与自动模式、一对多观察及可变数组观察。通过解析KVO的内部机制,如isa-swizzling,展示了KVO如何通过动态生成中间类来实现属性变化的通知。文章强调了保持KVO注册与移除的一对一关系以及在释放观察者前移除KVO的重要性。
最低0.47元/天 解锁文章
756





