iOS 底层探索篇 —— KVO 底层原理(上)

1. KVO

KVO(Key Value Observing, 键值观察)是Objective-C对观察者模式的实现,每次当被观察对象的某个属性值发生改变时,注册的观察者便能获得通知

1.1注册一个kvo

在这里插入图片描述

  • observer:观察者 也就是被观察对象发生改变时通知的接收者
  • keyPath:被观察的属性名
  • options:参数 这里一般选择NSKeyValueObservingOptionNewNSKeyValueObservingOptionOld 。也就是在回调方法里会受到被观察属性的旧值和新值,默认为只接收新值。如果想在注册观察者后,立即接收一次回调,则可以加入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就是手动

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值