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. As a result the 
value of the isa pointer does not necessarily reflect the actual class
of the instance.

对于KVO实现的原理,苹果官方文档描述的比较少,从中只能知道苹果使用了一张叫做isa-swizzling的黑魔法...

其实,当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类(类名就是在该类的前面加上NSKVONotifying_ 前缀),在这个派生类中重写基类中任何被观察属性的 setter 方法。

派生类在被重写的 setter 方法实现真正的通知机制,就如前面手动实现键值观察那样,调用willChangeValueForKey:和didChangeValueForKey:方法。这么做是基于设置属性会调用 setter 方法,而通过重写就获得了 KVO 需要的通知机制。当然前提是要通过遵循 KVO 的属性设置方式来变更属性值,如果仅是直接修改属性对应的成员变量,是无法实现 KVO 的。

同时派生类还重写了 class 方法以“欺骗”外部调用者它就是起初的那个类。然后系统将这个对象的 isa 指针指向这个新诞生的派生类,因此这个对象就成为该派生类的对象了,因而在该对象上对 setter 的调用就会调用重写的 setter,从而激活键值通知机制。此外,派生类还重写了 dealloc 方法来释放资源。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Key-Value Observing机制 知识点介绍 Key-Value Observing (简写为KVO):...
    此生浮华祇盼伊亽阅读 4,948评论 0 3
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,883评论 0 9
  • KVC 什么是 KVC KVC 是 Key-Value-Coding 的简称。 KVC 是一种可以直接通过字符串的...
    LeeJay阅读 6,558评论 6 41
  • 嗜苦而弃甜,是另外一种人生境界 苦乃是人类须臾不可分离的净友 苦涩中充溢着人生的甜蜜和醇美 想起知堂老人的那一句名...
    子涒阅读 1,738评论 2 5

友情链接更多精彩内容