KVC
本质:
objc
[object setValue: forKey:];
即使没有在.h 文件中有@property 的属性声明,setValue:forKey依然会按照上图流程执行代码
KVC 如果成功改变了成员变量,是一定可以被 KVO 监听到成员变量的前后改变的
KVO
- runtime会生成中间类:NSKVONotifying_类名
- 修改原来实例isa指向
实例isa指向 NSKVONotifying_类名
NSKVONotifying_类名 的isa 指向 class - 属性监听与改变
- 直接修改成员值时,KVO是无能为力的
kvo只能监听具有setProperty的属性 - runtime调用Fundation内部函数_NSSet数据类型(Int)ValueAndNotify。代码实现逻辑:
- 生成属性的set方法
- willChangeValueForKey:属性
- super set属性方法,修改 _属性 的值
- didChangeValueForKey:属性,此时调用监听器,通知外界属性改变。
[observer observeValueForKeyPath...]
- 直接修改成员值时,KVO是无能为力的
- 应用场景
- 给webView添加加载进图条
[self.wkWebView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil]; - 给ScrollView底部添加公共视图
监听contentSize,在contentInset安全边距扩展视图
- 给webView添加加载进图条