KVO(键值观察)机制实现技术,通过修改object对象的ISA指针指向中间代理类NSKVONotifying_xxx,NSKVONotifying_xxx的super_class指针指向原有的观察类对象object class
NSKVONotifying_xx生成的中间类重写被观察的对象的四个方法 class ,setter,dealloc,_isKVOA
001 重写class方法 是为了让观察对象调用[object class]返回的原有的类实例
002 重写setter方法 是为了能够监听到被观察者调用属性方法,如setXxxx(Xxxx为属性名称)
或者调用setValude:forKey:
时,能添加通知消息方法:
- (void)willChangeValueForKey:(NSString *)key
- (void) didChangeValueForKey:(NSString *)key
在didChangeValueForKey:中调用观察者必须重写的方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
-
自动通知,
NSObject
实现了自动通知的方法;- 存在
setter
访问器方法,并且通过setter
方法或者self.xxx
间接调用setter
方法,则中间类会添加will/didChangeValueForKey:
触发事件通知; - 不存在
setter
访问器方法,需要通过setValude:forKey:
方法来修改属性,中间类会添加will/didChangeValueForKey:
触发事件通知; - 对于集合类,如NSMutalArray,需要通过
mutableArrayValueForKey
来获取中间代理类,触发通知,否则直接通过addObject:
无法收到通知; - 对于存在依赖关系的属性,具体可查看官方文档;
- 存在
-
手动通知:手动通知提供了更自由的方式去决定什么时间,什么方式去通知观察者。这可以帮助你最少限度触发不必要的通知,或者一组改变值发出一个通知,想要使用手动通知必须实现
automaticallyNotifies-ObserversForKey:
方法;并且手动调用will/didChangeValueForKey:
来触发通知; -
重写dealloc
用来销毁新生成的
NSKVONotifying_
类;重写_isKVOA方法
这个私有方法估计可能是用来标示该类是一个 KVO 机制声称的类。