你不知道的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);
对比下~~~
这个问题留待下一遍 介绍 。
你不知道的KVO的内部实现的更多相关文章
- (译)KVO的内部实现
09年的一篇文章,比较深入地阐述了KVO的内部实现. KVO是实现Cocoa Bindings的基础,它提供了一种方法,当某个属性改变时,相应的objects会被通知到.在其他语言中,这种观察者模 ...
- [转](译)KVO的内部实现
转载自:http://www.cocoachina.com/applenews/devnews/2014/0107/7667.html 09年的一篇文章,比较深入地阐述了KVO的内部实现. K ...
- KVO的内部实现原理
kvo概述 kvo,全称Key-Value Observing,它提供了一种方法,当对象某个属性发生改变时,允许监听该属性值变化的对象可以接受到通知,然后通过kvo的方法响应一些操作. kvo实现原理 ...
- KVO的内部实现以及使用
转载自:http://www.cocoachina.com/applenews/devnews/2014/0107/7667.html KVO是实现Cocoa Bindings的基础,它提供了一种 ...
- runtime/KVO等面试题
整理中... 1.KVO内部实现原则 回答:1>KVO是基于runtime机制实现的 2>当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中 ...
- KVO的使用及底层实现
1.概念 KVO(Key-Value-Observer)也就是观察者模式,是苹果提供的一套事件通知机制.允许对象监听另一个对象特定属性的改变,并在改变时接收到事件,一般继承自NSObject的对象都默 ...
- 使用 KVO 可能会拖慢启动速度
问题  在某一次启动速度优化中,发现最开始的某个 runLoop 中,一个runLoop 耗时很长.发现一个 KVO 变量的初始化消耗了13ms之久,这对启动速度是不可接受了. 源码分析 用 Ins ...
- iOS面试题04-runtime
runtime/KVO等面试题 1.KVO内部实现原则 回答:1>KVO是基于runtime机制实现的 2>当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个 ...
- iOS设计模式 —— KV0
刨根问底KVO KVO 全称 Key-Value Observing.中文叫键值观察.KVO其实是一种观察者模式,观察者在键值改变时会得到通知,利用它可以很容易实现视图组件和数据模型的分离,当数据模型 ...
随机推荐
- 感谢大家对《Cocos2d-JS开发之旅》的支持
昨天收到一封读者的来信,给我报了个喜,也提了一些非常好的建议. 他通过短短1个月时间就完成了学习和游戏开发,并发布了Android和iOS平台,真了不起.授人以鱼不如授人以渔,这也是写书的最大喜悦吧. ...
- Java RSA (SHA1withRSA)签名和验签
static { try { SIGNATURE = Signature.getInstance("SHA1withRSA", "BC"); } catch ( ...
- 〖Android〗依据资源信息,Mock Android资源
#!/bin/bash - #=============================================================================== # # F ...
- Arduino和C51开发DS1302时钟
技术:51单片机.Arduino.DS1302时钟.串口通信 概述 本文实现51单片机和Arduino串口实时显示时钟功能,让读者对DS1302能够更好的理解,这次功能也和上节课学到的串口通信运用 ...
- Gerrit最简工作流
Gerrit最简工作流: git clone ... //注意clone with commit-msg hook,否则push可能失败(ERROR: missing Change-Id in c ...
- 【php页面表单提交】form校验后再提交,非ajax提交
form表单校验后,在执行提交动作: <form method="post" action="{:U('Custom/addmsg')}" id=&quo ...
- webservice(草稿)
1. 概述 WebService是一种跨编程语言和跨操作系统平台的远程调用技术. Webservice是被定义用来使不同应用之间通过网络传输数据的一种标准,此标准和具体的语言无关,至于哪种语言提供接 ...
- 使用requests库发起gbk编码的get请求
有一个爬虫,查询需要发起get请求,这个网站整个都是gbk编码 如果直接发起请求,是不可以的,因为请求参数q首先用utf8编码转化成bytes,然后将bytes进行URLEncode变为字符串. re ...
- wp实例开发精品文章源码推荐(8.20)
热门源码推荐 WP7快递速查源码http://www.apkbus.com/android-115763-1-1.html WP7仿iphone气泡式短信界面 源码http://www.apkbus. ...
- zabbix邮件告警之 通过shell脚本发送告警
说明:本文讲如何通过shell脚本实现zabbix发送告警邮件,共有5步1.设置mailx账号:是配置mailx的发信账号2.zabbix服务器端编写邮件发送脚本:是增加zabbix的告警方式,增加通 ...