你不知道的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

KVC 实现原理:http://blog.csdn.net/wzzvictory/article/details/9674431

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

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

阅读这篇文章发现一个有趣的现象:

[obj class]   和 object_getClass(obj)  有什么区别 

如:

    Class obj = [NSObject class];

    Class cls = object_getClass(obj);

    Class cls2 = [obj class];

    NSLog(@"%p",cls);

    NSLog(@"%p",cls2);

    NSLog(@"%p",obj);

你会发现什么? 打印的 cls 和 cls2 不同。 and 

    NSObject *obj1 = [NSObject new];

    Class cls3 = object_getClass(obj1);

    Class cls4 = [obj1 class];

    NSLog(@"%p",cls3);

    NSLog(@"%p",cls4);

对比下~~~

这个问题留待下一遍 介绍 。

 

 

posted @ 2014-07-17 17:27  hhhker  阅读(935)  评论(0编辑  收藏  举报