KVO的本质
作者:
39Coding | 来源:发表于
2020-06-30 12:55 被阅读0次
iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么)
- 使用
RuntimeAPI
动态生成一个子类NSKVONotifying_XXX
,并且让instance
对象的isa
指向这个全新的子类
- 当修改
instance
对象的这个属性时(调用这个属性的setter
方法),会调用Foundation
的_NSSetXXXValueAndNotify
函数
-
-willChangeValueForKey:
记录旧值,触发之后的didChangeValueForKey
- 原本父类的
setter
方法
赋值
-
-didChangeValueForKey:
内部触发监听器Observer
的监听方法-observeValueForKeyPath:ofObject:change:context:
- PS:直接监听成员变量不起效,除非有成员变量的
setXXX:
方法,因为生成的子类要重写这个方法来进行监听
// 直接修改不会触发KVO
self.per1->_height += 1;
// 这样才会触发KVO,说明NSKVONotifying_XXX内部重写的是setXXX:方法
[self.per1 setHeight:10];
KVO生成的子类_NSSetXXXValueAndNotify.jpg
使用KVO之前.jpg
使用KVO之后.jpg
如何手动触发KVO
- 手动调用
-willChangeValueForKey:
方法和-didChangeValueForKey:
方法
- 必须先
-willChangeValueForKey:
后-didChangeValueForKey:
,且缺一不可
直接修改成员变量会触发KVO吗?
- 不会触发
KVO
,调用setter
方法才会触发KVO
,因为KVO
生成的子类内部重写的是这个属性的setter
方法
本文标题:KVO的本质
本文链接:https://www.haomeiwen.com/subject/catxqktx.html
网友评论