概述
KVO全称KeyValueObserving,是苹果提供的一套事件通知机制。允许对象监听另一个对象特定属性的改变,并在改变时接收到事件。由于KVO的实现机制,所以对属性才会发生作用,一般继承自NSObject的对象都默认支持KVO。
KVO和NSNotificationCenter都是iOS中观察者模式的一种实现。区别在于,相对于被观察者和观察者之间的关系,KVO是一对一的,而不一对多的。KVO对被监听对象无侵入性,不需要修改其内部代码即可实现监听。
简单使用
注册观察者
使用方法: addObserver:forKeyPath:options:context
参数含义:
1. observer:观察者,监听属性变化的对象。该对象必须实现 observeValueForKeyPath:ofObject:change:context: 方法。
2. keyPath:要观察的属性名称。要和属性声明的名称一致。
3. options:对KVO机制进行配置,修改KVO通知的时机以及通知的内容
4. context: 传入任意类型的对象,在"接收消息回调"的代码中可以接收到这个对象,是KVO中的一种传值方式。
默认只接受新值
NSKeyValueObservingOptionNew:接收方法中使用change参数传入变化后的新值,键为:NSKeyValueChangeNewKey;
NSKeyValueObservingOptionOld:接收方法中使用change参数传入变化前的旧值,键为:NSKeyValueChangeOldKey;
NSKeyValueObservingOptionInitial:注册之后立刻调用接收方法,如果配置了NSKeyValueObservingOptionNew,change参数内容会包含新值,键为:NSKeyValueChangeNewKey;
NSKeyValueObservingOptionPrior:如果加入这个参数,接收方法会在变化前后分别调用一次,共两次,变化前的通知change参数包含notificationIsPrior = 1。
在观察者实现对应的方法
注册后,当属性的值发生变化时,框架默认会自动通知注册的观察者
不需要监听的时候进行移除
一些注意事项
- addObserver之后,在不需要监听的时候,要及时remove,否则被监听对象释放后,再触发监听器会引起崩溃
- addObserver方法与removeObserver方法要一一对应。不要重复添加监听,也不要试图删除没有添加过的监听。重复添国监听,在被监听对象属性改变时,会多次调用监听方法。试图删除没有添加过的监听器会引起崩溃