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监听的对象
原理
- 利用
Runtime
API动态生成一个子类(NSKVONotifying_*),并且让instance对象
的isa指向这个全新的子类 - 当修改
instance对象
的属性时,执行setter方法,会调用Foundation的_NSSetXXXValueAndNotify
函数
_NSSetXXXValueAndNotify内部实现(伪代码)
1 | void _NSSetXXXValueAndNotify() { |
附录
疑问
Q:如何手动触发KVO?
A:手动调用willChangeValueForKey:
和didChangeValueForKey:
Q:直接修改成员变量会触发KVO么?
A:不会触发KVO。因为KVO监听,是通过setter方法触发的