1.KVC的实现过程

以 [object setValue:@"134567" forKey:@"uid"];为例子,来探究KVC的实现过程

第一步:搜索
1、首先搜索setKey:方法.(key指成员变量名, 首字母大写)
2、上面的setter方法没找到, 如果类方法accessInstanceVariablesDirectly返回YES. 那么按 _key, _isKey,key, iskey的顺序搜索成员名.(NSKeyValueCodingCatogery中实现的类方法, 默认实现为返回YES)
3、如果没有找到成员变量, 调用setValue:forUnderfinedKey:

第二步:编译器处理
被编译器处理后:
// 首先找到对应sel
SEL sel = sel_get_uid("setValue:forKey:");
// 根据object->isa找到sel对应的IMP实现指针
IMP method = objc_msg_lookup (object->isa,sel);
// 调用指针完成KVC赋值
method(object, sel, @"134567", @"uid");

解释:
1.先根据方法名通过C函数sel_get_uid拿到选择子sel
2.使用C函数objc_msg_lookup通过对象指针,选择子获取函数实现指针
3. 调用C函数method(object, sel, @"134567", @"uid"),实现KVC赋值

2.KVO的实现过程

第一步:调用KVC方法
KVO若有起作用,首先要先调用KVC方法:
[self.object addObserver:self forKeyPath:@"uid" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];

第二步:实现KVO后,系统相应的处理
系统实现KVO有以下几个步骤:
1.当类A的对象第一次被观察的时候,系统会利用运行时动态创建与类A一样的NSKVONotifying_A派生类, 并且只有1个属性的get, set方法实现.
2.在派生类NSKVONotifying_A中重写类A的setter方法,NSKVONotifying_A类在被重写的setter方法中实现通知机制。
3.类NSKVONotifying_A重写会 class方法,将自己伪装成类A。类NSKVONotifying_A还会重写dealloc方法释放资源。
4.系统将所有指向类A对象的isa指针指向类NSKVONotifying_A的对象。

参考文章:
KVC, KVO 实现原理:http://www.cnblogs.com/MrTao/p/5825457.html

最新文章

  1. eclipse gradle插件(buildship)的安装和使用
  2. c4,configure the debug environment
  3. Eclipse的自动排版设置(format)
  4. 代码设计工具——PowerDesigner
  5. 剑指Offer 从上往下打印二叉树(dfs)
  6. 可能碰到的iOS笔试面试题(4)--C语言
  7. JAVA 遍历文件夹下的所有文件
  8. underscorejs-size学习
  9. poj 2482 Stars in Your Window(扫描线)
  10. 网络资源(10) - Eclipse开发项目
  11. Mysql基于GTID主从复制
  12. C#之自定义特性
  13. PROJ.4学习——地图投影
  14. 关于if判断和switch
  15. admin-2
  16. IO模型的介绍
  17. 5.QT-QString类
  18. 【Java集合的详细研究4】Java中如何遍历Map对象的4种方法
  19. STL_map.插入
  20. UVa 12657 Boxes in a Line(数组模拟双链表)

热门文章

  1. 【架构】基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎
  2. ASP.NET MVC 控制器通过继承控制器来达到 过滤 并且多了一个IAuthenticationFilter
  3. python学习之路 六 :装饰器
  4. Luckily general gradient for spherical harmonics is defined
  5. vue.js 一些知识点
  6. 三,Smarty模板技术/引擎——变量操作(2)
  7. UIView之setNeedsDisplay与drawRect 和 setNeedsLayout与layoutSubViews
  8. CH5102 Mobile Service
  9. [集合]Collection集合框架源码分析
  10. 题目1010:A + B(字符串拆分)