KVO的底层实现

KVO是基于runtime机制实现的/small-talk

当某个类的属性对象第一次被观察时,系统就会在运行期间动态地创建该类的一个派生类,在这个派生类中重写基类的任何被观察属性的setter方法。派生类在被重写的setter方法内实现真正的通知机制

如果原类为Person,那么生成的派生类名为NSKVONotifying_Person

我们知道,每一个类中都有一个isa指针指向当前类,所有系统就是在当一个类的对象第一次被观察的时候,系统就会偷偷将isa指针指向动态生成的派生类,从而在被监听属性赋值时被执行的是派生类的setter方法

键值观察通知依赖于NSObject 的两个方法: willChangeValueForKey: 和 didChangevlueForKey:;在一个被观察属性发生改变之前, willChangeValueForKey: 一定会被调用,这就 会记录旧的值。而当改变发生后,didChangeValueForKey: 会被调用,继而 observeValueForKey:ofObject:change:context: 也会被调用。

补充:KVO的这套实现机制中苹果还偷偷重写了class方法,让我们误认为还是使用的当前类,从而达到隐藏生成的派生类

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

推荐阅读更多精彩内容

  • 引用孙源的话 http://blog.sunnyxx.com/2014/03/09/objc_kvo_secret...
    charlotte2018阅读 439评论 0 1
  • 主要是写一下自己对如何自己动手实现 KVO这个文章的理解。 当你观察一个对象时,一个新的类会动态被创建。这个类继承...
    三十一_iOS阅读 866评论 0 0
  • 每当境遇不顺,心情不爽的时候,抱怨,吐槽就成为了必然。而每每我们正在肆无忌惮的宣泄我们的情感时,各种“积极向上”的...
    sky_小渣阅读 245评论 2 0
  • 佛说:我虽有宇宙最大的神通力,但依然有四件事情是做不到的: 第一,因果不可改:自因自果,别人是代替不了的; 第二,...
    十年一井阅读 311评论 2 0
  • 科二是我这几个月来的痛,今天早上一直在下中雨,考试到最后一步倒车入库了,准备到右边倒库时,由于前轮没压线...
    4583f9b563ad阅读 535评论 0 3