KVO 实现原理与实现一个自己的 KVO 以及 KVC 的详解(转载&记录)

珠玉在前 ,此篇为转载以及学习记录

KVO

大神文章 : Mike Ash 早期深究 KVO

原理:神经病院Objective-C Runtime出院第三天——如何正确使用Runtime

实现:如何自己动手实现 KVO

总结:

官方文档中,提到 KVO 只有以下内容

Automatic key-value observing is implemented using a technique called *isa-swizzling*.

The `isa` pointer, as the name suggests, points to the object's class which maintains a dispatch table. This dispatch table essentially contains pointers to the methods the class implements, among other data.

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.

You should never rely on the `isa` pointer to determine class membership. Instead, you should use the `[class](https://developer.apple.com/documentation/objectivec/1418956-nsobject/1571949-class)` method to determine the class of an object instance.

可见 KVO 的实现使用了 isa swizzling

简单概述下 KVO 的实现:

当你观察一个对象时,一个新的类会动态被创建。这个类继承自该对象的原本的类,并重写了被观察属性的 setter 方法。
自然,重写的 setter 方法会负责在调用原 setter 方法之前和之后,通知所有观察对象值的更改。
最后把这个对象的 isa 指针 ( isa 指针告诉 Runtime 系统这个对象的类是什么 ) 指向这个新创建的子类,对象就神奇的变成了新创建的子类的实例。

原来,这个中间类,继承自原本的那个类。不仅如此,Apple 还重写了 -class 方法,企图欺骗我们这个类没有变,就是原本那个类。

KVC

详解KVC:iOS开发技巧系列---详解KVC(我告诉你KVC的一切)

推荐阅读更多精彩内容