一、KVC运用了一个isa-swizzling技术。isa-swizzling就是类型混合指针机制。KVC主要通过isa-swizzling,来实现其内部查找定位的。isa指针,如其名称所指,(就是is a kind of的意思),指向维护分发表的对象的类。该分发表实际上包含了指向实现类中的方法的指针,和其它数据。

比如说如下的一行KVC的代码:

[site setValue:@"sitename" forKey:@"name"];

就会被编译器处理成:

SEL sel = sel_get_uid ("setValue:forKey:");

IMP method = objc_msg_lookup (site->isa,sel);

method(site, sel, @"sitename", @"name");

首先介绍两个基本概念:

(1)SEL数据类型:它是编译器运行Objective-C里的方法的环境参数。

(2)IMP数据类型:他其实就是一个编译器内部实现时候的函数指针。当Objective-C编译器去处理实现一个方法的时候,就会指向一个IMP对象,这个对象是C语言表述的类型。

KVC再某种程度上提供了访问器的替代方案。不过访问器方法是一个很好的东西,以至于只要是有可能,KVC也尽量再访问器方法的帮助下工作。为了设置或者返回对象属性,KVC按顺序使用如下技术:

1)检查是否存在名为-set:的方法,并使用它做设置值。对于-get和-set:方法,将大写Key字符串的第一个字母,并与Cocoa的方法命名保持一致;

2)如果上述方法不可用,则检查名为-_、-_is(只针对布尔值有效)、-_get和-_set:方法;

3)如果没有找到访问器方法,可以尝试直接访问实例变量。实例变量可以是名为:或_;

4)如果仍为找到,则调用valueForUndefinedKey:和setValue:forUndefinedKey:方法。这些方法的默认实现都是抛出异常,我们可以根据需要重写它们。

二、KVO是基于KVC实现的,看下面的代码:

#pragma mark - KVO实现原理

Person *person = [[Person alloc] init];

[person setName:@"Jacedy"];

// 设置监听

[person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];

[person setName:@"Jack"];

self.person = person;

}

// 响应监听

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

NSLog(@"%@ 对象的 %@ 属性改变了:%@", object, keyPath, change);

}

- (void)dealloc

{

// 移除监听

[self.person removeObserver:self forKeyPath:@"name"];

}

对代码进行断点跟踪发现如下:

当添加了监听后:

不难发现,person对象的isa指针由Person变成了NSKVONotifying_Perosn。其实,当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的 setter 方法。派生类在被重写的 setter 方法实现真正的通知机制:

- (void)setName:(NSString *)name

{

[super setName:name];

[监听器 observeValueForKeyPath:@"name"  ofObject:self  change:@{}  context:nil];

}

kvo实现原理_KVC、KVO实现原理相关推荐

  1. iOS KVO crash 自修复技术实现与原理解析

    摘要: [前言]KVO API设计非常不合理,于是有很多的KVO三方库,比如 KVOController 用更优的API来规避这些crash,但是侵入性比较大,必须编码规范来约束所有人都要使用该方式. ...

  2. iOS底层原理之KVO本质

    面试中常会问道: iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?) 如何手动触发KVO 什么是KVO 首先需要了解KVO基本使用,KVO的全称 Key-Value Observing, ...

  3. AbstractQueuedSynchronizer 原理分析 - Condition 实现原理

    1. 简介 Condition是一个接口,AbstractQueuedSynchronizer 中的ConditionObject内部类实现了这个接口.Condition声明了一组等待/通知的方法,这 ...

  4. 电机编码器调零步骤_编码器原理、霍尔应用原理、调整步骤三个方面进行解读编码器调试...

    电机中若具备电子铭牌功能,在应用中就可以直接使用,不需要需要调整编码器:如雷赛交流伺服电机具有电子铭牌功能,能自动识别电机型号,参数并对应匹配参数就能发挥伺服优异性能.若不具备电子铭牌功能的电机,则需 ...

  5. [有限元]虚位移原理和虚力原理的证明的统一逻辑

    原来的可能位移/可能力的约束方程是: 力边界上 可能力=常数1 位移边界上 可能位移=常数2 体内 可能平衡方程=常数3 所以可能功原理的右边有三项 由定义, 虚位移=可能位移1-可能位移2 虚力=可 ...

  6. v-model双向绑定原理_【Vue原理】VModel 白话版

    ↑点击上方 "神仙朱" 一起研究Vue源码吧 专注 Vue 源码分享,为了方便大家理解,分为了白话版和 源码版,白话版让大家可以轻松理解工作原理,源码版让大家更清楚内部操作和 Vu ...

  7. 计算机输入输出设备说课稿,信息技术七年级西交大版 第三节 计算机系统的组成与工作原理计算机系统及工作原理说课稿 (共15张PPT)...

    <信息技术七年级西交大版 第三节 计算机系统的组成与工作原理计算机系统及工作原理说课稿 (共15张PPT)>由会员分享,可在线阅读,更多相关<信息技术七年级西交大版 第三节 计算机系 ...

  8. 计算机指纹识别的原理步骤,指纹识别原理和过程

    指纹识别概念 指纹识别是生物识别的一种.不过其所分析的对象是指纹特征.指纹特征是最早被发现和应用的,所以指纹识别的历史较之其它识别技术要悠久的多.出现自动化的指纹识别系统到现在,目前的指纹识别技术已经 ...

  9. 计算机原理的拼音,微机原理课程,the course of microcomputer principles,音标,读音,翻译,英文例句,英语词典...

    化工原理课程是化学工业技术和化学工程科学发展的必然产物.十九世纪九十年代国外高等学校相继设置化学工程系,开出的课程大都是针对不同化工行业编写各自的生产工艺学,直到二十世纪初才明确认识到各行各业通用的物 ...

  10. 支持向量机原理(四)SMO算法原理

    支持向量机原理(一) 线性支持向量机 支持向量机原理(二) 线性支持向量机的软间隔最大化模型 支持向量机原理(三)线性不可分支持向量机与核函数 支持向量机原理(四)SMO算法原理 支持向量机原理(五) ...

最新文章

  1. 是男人就下100层【第五层】——2048游戏从源代码到公布市场
  2. Python实现向s3共享存储上传和下载文件
  3. 剑指offer:二叉树的下一个节点
  4. JS魔法堂:IE5~9的DragDrop API
  5. android 模拟器横竖屏切换
  6. C语言用位运算构建特定的二进制数
  7. php ajax 删除行,php – 使用jQuery Ajax删除mySQL表行
  8. Apache Camel Intellij IDEA插件的工作已开始
  9. 无需重新部署Eclipse和Tomcat即可进行更改
  10. python爬取b站评论_学习笔记(1):写了个python爬取B站视频评论的程序
  11. SAP License:后SAP ECC 6.0 时代
  12. 带背景音乐的表白html,感人的表白背景音乐,适合浪漫表白的纯音乐
  13. python基础-字符串(6)
  14. 论文阅读笔记(一)——DESCENDING THROUGH A CROWDED VALLEY—BENCHMARKING DEEP LEARNING OPTIMIZERS
  15. 百度快排点击软件-搜索引擎排名模拟点击器-快排点击软件
  16. 4.4 Recovery和Removal分析
  17. Java多线程游戏-雷霆战机
  18. node 单元测试_如何在Node中模拟对单元测试的请求
  19. python对整数进行因数分解_浅谈将一个正整数分解质因数的逻辑思维和Python开发设计...
  20. 如何制作出美观的游戏界面?

热门文章

  1. 巨杉数据库通过“Mpp数据库基础能力认证”,权威技术认证金融级数据库
  2. 【ZZ】浅谈大型web系统架构 | 菜鸟教程
  3. 一个云本地文件包含漏洞,影响世界一流公司
  4. Linux Ubuntu从零开始部署web环境及项目 -----tomcat+jdk+mysql (二)
  5. reactor与proactor模式
  6. MySQL之alter语句用法总结
  7. 论工程结构设计的重要性
  8. 基于HTML5的WebGL结合Box2DJS物理应用
  9. php的yii2框架下开发环境xampp,vim,xdebug,DBGp的搭建
  10. 扫盲:关于Android手机内存ROM、RAM还有SD卡的解释