OC-KVO
KVO的全称是Key-Value Observing,俗称“键值监听”,可以用于监听某个对象属性值的改变
背景
- 定义一个Person类
 
1  | @interface Person : NSObject  | 
- 添加监听
 
1  | [self.person addObserver:self forKeyPath:@"age" options:(NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew) context:@"123"];  | 
本质
内存结构:未使用KVO监听的对象
内存结构:使用了KVO监听的对象
原理
- 利用
RuntimeAPI动态生成一个子类(NSKVONotifying_*),并且让instance对象的isa指向这个全新的子类 - 当修改
instance对象的属性时,执行setter方法,会调用Foundation的_NSSetXXXValueAndNotify函数 
_NSSetXXXValueAndNotify内部实现(伪代码)
1  | void _NSSetXXXValueAndNotify() {  | 
附录
疑问
Q:如何手动触发KVO?
A:手动调用willChangeValueForKey:和didChangeValueForKey:
Q:直接修改成员变量会触发KVO么?
A:不会触发KVO。因为KVO监听,是通过setter方法触发的