iOS Daily Tip - KVO实现原理

这是最近被刷屏的某2018 iOS面试题列表中的一题,值得一看。

KVO在Apple中的API文档如下:

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 …

KVO基本原理

  • KVO是基于runtime机制实现的。
  • 当类的属性第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter 方法,并在setter方法内实现真正的通知机制。如果原类为Person,那么生成的派生类名为NSKVONotifying_Person。
  • 每个类对象中都有一个isa指针指向当前类,当类对象的属性的第一次被观察,那么系统会将isa指针指向动态生成的派生类(NSKVONotifying_Person),从而在给被监控属性赋值时执行的是派生类的setter方法。
  • 键值观察通知依赖于NSObject 的两个方法willChangeValueForKey:didChangeValueForKey:。在被观察属性发生改变之前, willChangeValueForKey:会被调用,这就会记录旧的值。而当改变发生后,didChangeValueForKey:会被调用,继而 observeValueForKey:ofObject:change:context:也会被调用。

具体流程如下:


1829339-77757288cc139f44.png

可加群一起交流共同学习:801216530。

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

推荐阅读更多精彩内容

  • 问题 iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?) 如何手动触发KVO ? 首先需要了解KVO...
    hjltony阅读 586评论 0 2
  • 上一篇:iOS-KVC浅谈 前言:KVO 作为 KVC 的同袍兄弟,功能更强大,聊聊 KVO。 一、KVO 简介 ...
    梦蕊dream阅读 742评论 0 0
  • KVC 什么是KVC KVC是Key-Value-Coding 的简称。 KVC是一种可以直接通过字符串的名字ke...
    Jack_deng阅读 1,105评论 0 0
  • 面试问题: · iOS用什么方式实现对一个对象的KVO? · 如何手动触发KVO? 我们通过以下几个点来寻找这两个...
    高思阳阅读 252评论 0 1
  • 博客链接KVO实现原理 在iOS开发中,我们可以通过KVO机制来监听某个对象的某个属性的变化。 KVO实现步骤 K...
    NeroXie阅读 487评论 0 5