首页 > 代码库 > 你不知道的KVO的内部实现

你不知道的KVO的内部实现

通过强大的Runtime 实现。第一次观察某个Object 时,runtime 会创建一个新的继承自 object 对应Class 的 subClass。在这个新subClass 里它重写了被观察的key(属性)的setter 方法。然后将object 指向原来对应Class 的isa指针指向了新创建的subClass【原因很简单,实例对象保有变量,而向对象发消息实际是那isa 去类对象里找对应的实例方法去了。即重写的setter 方法】;

      这些被重写的setter 实现了如何通知观察者们。

有意思的是:ios 不希望这个机制暴露在外。除了setter ,这个动态生成的subClass 同时也重写了  -class  方法,依旧返回原先的class. 不知细看的话,被kvo 过得object 看起来和原先的object 没什么两样。【而实际是object 所指向的类 及里面的有些实例方法 变了】。

 

关于代码验证可见:    http://limboy.me/ios/2013/08/05/internal-implementation-of-kvo.html

可以不用他那个gcc 编译,在自己项目的main.m 里替换下。会有两个错。

obj - > isa   可以用 object_getClass(obj) 替换也是一样的。