KVO
KVO的全称是Key-Value Observing ,俗称“健值监听”,可以用与监听某个对象属性值的改变
KVO使用
有关KVO的使用可以看早期这篇博客
iOS消息机制—KVO
KVO本质探究
首先存在的疑问
我们先进行探究 创建两个实例对象 然后对person1进行KVO经过测试后结果如下我们只发现了person1和person2 都发生了变化,但是只用person1受到
可监听,而他们的赋值语句都是一样的,那么我们便对实例对象进行检测
对实例对象打上断点,并用控制台打印两个类我们发现
self.person1.isa = NSKVONotifying_YJXPerson;
self.person2.isa = YJXPerson;
我们发现进行KVO监听后两者的类会产生变化
本质探究
之所以会这样是因为iOS tuntime 动态产生了新的类
如下图 未使用监听前
监听后
其实 setName 方法内部 是调用了 Foundation 的 _NSSetObjectValueAndNotify 函数 ,在 _NSSetObjectValueAndNotify 内部
1 首先会调用 willChangeValueForKey
2 然后给 name 属性赋值
3 最后调用 didChangeValueForKey
4 最后调用 observer 的 observeValueForKeyPath 去告诉监听器属性值发生了改变 .
至于重写了 dealloc 和 class 方法 是为了做一些 KVO 释放内存 和 隐藏外界对于 NSKVONotifying_Person 子类的存在
这就是我们调用 [p1 class] 和 [p2 class]结果都显示 Person 类 ,让我们误以为 Person 没有发生变化