简介
KVO全称KeyValueObserving,俗称键值监听,是苹果提供的一种事件通知机制,用于监听对象属性改变。
使用
1. 通过addObserver:forKeyPath:options:context:方法注册观察者
2. 实现observeValueForKeyPath:ofObject:change:context:方法,当属性发生改变时,会回调这个方法
3. 调用removeObserver:forKeyPath:方法移除KVO,add和remove成对出现
原理
1. 对象添加KVO监听后,会利用RuntimeAPI动态生成一个子类,并让对象的isa指针指向这个全新的子类,该子类重写了set、class、dealloc方法,新增_isKVOA方法,其中set方法的IMP指针指向Foundation框架的_NSSetObjectValueAndNotify函数
2. 当修改对象的属性时,系统会先后调用子类的set方法——Foundation框架的_NSSetObjectValueAndNotify函数,willChangeValueForKey方法,父类的set方法,didChangeValueForKey方法,最后会触发监听器(Observer)的监听方法observeValueForKeyPath:ofObject:change:context: