iOS 底层学习——KVO

·  阅读 179

点击获取更多资料

KVO

KVO的全称是Key-Value Observing ,俗称“健值监听”,可以用与监听某个对象属性值的改变

KVO使用

概述
KVO全称KeyValueObserving,是苹果提供的一套事件通知机制。允许对象监听另一个对象特定属性的改变,并在改变时接收到事件。由于KVO的实现机制,所以对属性才会发生作用,一般继承自NSObject的对象都默认支持KVO。

KVO和NSNotificationCenter都是iOS中观察者模式的一种实现。区别在于,相对于被观察者和观察者之间的关系,KVO是一对一的,而不一对多的。KVO对被监听对象无侵入性,不需要修改其内部代码即可实现监听。

简单使用
注册观察者
使用方法: addObserver:forKeyPath:options:context
参数含义:

  1. observer:观察者,监听属性变化的对象。该对象必须实现 observeValueForKeyPath:ofObject:change:context: 方法。
  2. keyPath:要观察的属性名称。要和属性声明的名称一致。
  3. options:对KVO机制进行配置,修改KVO通知的时机以及通知的内容
  4. context: 传入任意类型的对象,在"接收消息回调"的代码中可以接收到这个对象,是KVO中的一种传值方式。

默认只接受新值

NSKeyValueObservingOptionNew:接收方法中使用change参数传入变化后的新值,键为:NSKeyValueChangeNewKey;
NSKeyValueObservingOptionOld:接收方法中使用change参数传入变化前的旧值,键为:NSKeyValueChangeOldKey;
NSKeyValueObservingOptionInitial:注册之后立刻调用接收方法,如果配置了NSKeyValueObservingOptionNew,change参数内容会包含新值,键为:NSKeyValueChangeNewKey;
NSKeyValueObservingOptionPrior:如果加入这个参数,接收方法会在变化前后分别调用一次,共两次,变化前的通知change参数包含notificationIsPrior = 1。

在观察者实现对应的方法
注册后,当属性的值发生变化时,框架默认会自动通知注册的观察者

不需要监听的时候进行移除

一些注意事项
addObserver之后,在不需要监听的时候,要及时remove,否则被监听对象释放后,再触发监听器会引起崩溃
addObserver方法与removeObserver方法要一一对应。不要重复添加监听,也不要试图删除没有添加过的监听。重复添国监听,在被监听对象属性改变时,会多次调用监听方法。试图删除没有添加过的监听器会引起崩溃

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 :



求喜欢iOS的小伙伴关注 !喜欢的话给一个赞吧!谢谢!谢谢!谢谢!
————————————————

点击获取更多资料

收录:原文链接

分类:
iOS
标签:
分类:
iOS
标签:
收藏成功!
已添加到「」, 点击更改