博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
你不知道的KVO的内部实现
阅读量:6284 次
发布时间:2019-06-22

本文共 900 字,大约阅读时间需要 3 分钟。

通过强大的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 所指向的类 及里面的有些实例方法 变了】。

 

关于代码验证可见:    

KVC 实现原理:

可以不用他那个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);

对比下~~~

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

 

 

转载地址:http://awhva.baihongyu.com/

你可能感兴趣的文章
String 源码浅析(一)
查看>>
Spring Boot 最佳实践(三)模板引擎FreeMarker集成
查看>>
Fescar 发布 0.2.3 版本,支持 Redis 和 Apollo
查看>>
Google MapReduce到底解决什么问题?
查看>>
CCNP-6 OSPF试验2(BSCI)
查看>>
Excel 2013 全新的图表体验
查看>>
openstack 制作大于2TB根分区自动扩容的CENTOS镜像
查看>>
Unbuntu安装遭遇 vmware上的Easy install模式
查看>>
几个常用的ASP木马
查看>>
python分析postfix邮件日志的状态
查看>>
Mysql-5.6.x多实例配置
查看>>
psutil
查看>>
在git@osc上托管自己的代码
查看>>
机器学习算法:朴素贝叶斯
查看>>
小五思科技术学习笔记之扩展访问列表
查看>>
使用Python脚本检验文件系统数据完整性
查看>>
使用MDT部署Windows Server 2003 R2
查看>>
Redhat as5安装Mysql5.0.28
查看>>
通过TMG发布ActiveSync
查看>>
Web服务器的配置与管理(4) 配置访问权限和安全
查看>>