iOS 底层学习—-KVO

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 没有发生变化在这里插入图片描述

KVC 原理

setvalue :forkey :

在这里插入图片描述

valueForkey :

在这里插入图片描述github代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值