KVO内部实现原理

KVO接口说明

注册:addObserver:forKeyPath:options:context:

例如

[self.busModel  addObserver: self  forKeyPath: @"name" options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOldcontext:@"bus name"];

1>.self.busModel :要监听的对象

2>.self 观察者,负责处理监听事件的对象

3>.监听的属性

4>.观察的选项(例如新值)

5>.上下文,用于传递数据,可以利用它区分不同的监听

属性改变时调用的方法

- (void)observeValueForKeyPath:(NSString *)keyPath   ofObject:(id)object  change:(NSDictionary *)change   context:(void*)context

1>.监听的属性

2>.属性所属对象

3>.属性的变化

4>.上下文


Apple的文档对 KVO 实现的描述:

Automatic key-value observing is implemented using a technique called isa-swizzling... When an observer is registered for an attribute of an object the isa pointer of the observed object is modified, pointing to an intermediate class rather than at the true class ...

并未过多的暴露内部实现的细节:是通过isa-swizzling(isa混编)来实现的

其实当我们观察一个对象时,会动态的创建一个新类,这个类继承与我们所观察的对象所在的类,并重写了观察对象的属性的setter方法,在setter方法中实现真正的通知机制:

如图:


1.每个类对象中都有一个isa指针指向当前类,当一个类对象的第一次被观察,那么系统会偷偷将isa(isa 指针告诉 Runtime 系统这个对象的类是什么)指针指向动态生成新类,从而在给被监控属性赋值时执行的是派生类的setter方法

2.键值观察通知依赖于 NSObject 的两个方法:willChangeValueForKey:和didChangevlueForKey:。在一个被观察属性发生改变之前,willChangeValueForKey:一定会被调用,这就会记录旧的值。而当改变发生后didChangeValueForKey:也会被调用,在observers列表中检查是否有该属性,有的话observeValueForKey:ofObject:change:context:也会被调用

经测试observeValueForKey是在didChangeValueForKey执行时调用的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,774评论 0 9
  • KVO基本概念:主要用来监听某个对象的某个属性的变化,当发生变化的时候,观察者会调用对应的函数,实现对应的功能。 ...
    _那有只喵阅读 664评论 3 2
  • KVO是基于runtime机制实现的 当某个类的属性对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类...
    泥孩儿0107阅读 111评论 0 0
  • KVO内部实现原理 -->KVO是基于runtime机制实现的 -->当某个类的属性对象第一次被观察时,系统就会在...
    牧马人_hlc阅读 788评论 1 12
  • 《用户体验要素》对想做产品的同学是一本很好的思想指导书.这本书对一个产品的形成过程进行解耦,将用户体验的好坏归为不...
    你的小美女哇阅读 213评论 0 0