深入理解 KVC\KVO 实现机制 — KVC
KVC和KVO都属于键值编程而且底层实现机制都是isa-swizzing,所以本来想放在一起讲的。但是篇幅有限所以就分成了两篇博文 KVO实现机制传送门
KVC概述
- KVC是Key Value Coding的简称。它是一种可以通过字符串的名字(key)来访问类属性的机制。而不是通过调用Setter、Getter方法访问。
- 关键方法定义在 NSKeyValueCodingProtocol
- KVC支持类对象和内建基本数据类型。
KVC使用
获取值
valueForKey: 传入NSString属性的名字。
valueForKeyPath: 属性的路径,xx.xx
valueForUndefinedKey 默认实现是抛出异常,可重写这个函数做错误处理修改值
setValue:forKey:
setValue:forKeyPath:
setValue:forUnderfinedKey:
setNilValueForKey: 对非类对象属性设置nil时调用,默认抛出异常。
KVC键值查找
搜索单值成员
setValue:forKey:搜索方式
1、首先搜索setKey:方法。(key指成员变量名,首字母大写)
2、上面的setter方法没找到,如果类方法accessInstanceVariablesDirectly返回YES。那么按 _key,_isKey,key,iskey的顺序搜索成员名。(NSKeyValueCodingCatogery中实现的类方法,默认实现为返回YES)
3、如果没有找到成员变量,调用setValue:forUnderfinedKey:
valueForKey:的搜索方式
1、首先按getKey,key,isKey的顺序查找getter方法,找到直接调用。如果是BOOL、int等内建值类型,会做NSNumber的转换。
2、上面的getter没找到,查找countOfKey、objectInKeyAtindex、KeyAtindexes格式的方法。如果countOfKey和另外两个方法中的一个找到,那么就会返回一个可以响应NSArray所有方法的代理集合的NSArray消息方法。
3、还没找到,查找countOfKey、enumeratorOfKey、memberOfKey格式的方法。如果这三个方法都找到,那么就返回一个可以响应NSSet所有方法的代理集合。
4、还是没找到,如果类方法accessInstanceVariablesDirectly返回YES。那么按 _key,_isKey,key,iskey的顺序搜索成员名。5、再没找到,调用valueForUndefinedKey。
KVC实现分析
KVC运用了isa-swizzing技术。isa-swizzing就是类型混合指针机制。KVC通过isa-swizzing实现其内部查找定位。isa指针(is kind of 的意思)指向维护分发表的对象的类,该分发表实际上包含了指向实现类中的方法的指针和其他数据。
比如说如下的一行KVC代码:
[site setValue:@"sitename" forKey:@"name"];//会被编译器处理成SEL sel = sel_get_uid(setValue:forKey); IMP method = objc_msg_loopup(site->isa,sel); method(site,sel,@"sitename",@"name");
每个类都有一张方法表,是一个hash表,值是还书指针IMP,SEL的名称就是查表时所用的键。
SEL数据类型:查找方法表时所用的键。定义成char*,实质上可以理解成int值。
IMP数据类型:他其实就是一个编译器内部实现时候的函数指针。当Objective-C编译器去处理实现一个方法的时候,就会指向一个IMP对象,这个对象是C语言表述的类型。
KVC的内部机制:
一个对象在调用setValue的时候进行了如下操作:
- (1)根据方法名找到运行方法的时候需要的环境参数
- (2)他会从自己的isa指针结合环境参数,找到具体的方法实现接口。
- (3)再直接查找得来的具体的实现方法
转载于:https://www.cnblogs.com/Ghosgt/p/5973085.html
深入理解 KVC\KVO 实现机制 — KVC相关推荐
- zzz KVC/KVO原理详解及编程指南
前言: 1.本文基本不讲KVC/KVO的用法,只结合网上的资料说说对这种技术的理解. 2.由于KVO内容较少,而且是以KVC为基础实现的,本文将着重介绍KVC部分. 一.简介 KVC/KVO是观察者模 ...
- KVC/KVO原理详解及编程指南
作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注 ...
- KVO(NSKeyValueObserving)、KVC(NSKeyValueCoding)作用浅谈
[iOS] KVO(NSKeyValueObserving).KVC(NSKeyValueCoding)作用浅谈 在很多时候接触到很多地方都有对KVC,KVO的描述,但是都是一笔带过.只知道这是Obj ...
- 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态
一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...
- KVC/KVO 使用细节和调用顺序
Key-Value Coding (KVC) Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一个非正式的 Protocol,提供一种机制来间接访问对象 ...
- KVC/KVO 本质
KVO 的实现原理 KVO是关于runtime机制实现的 当某个类的对象属性第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法.派生类 ...
- KVC/KVO实现原理分析
2019独角兽企业重金招聘Python工程师标准>>> 1. 函数调用(消息)实现分析: 我们看这条语句: [代码]c#/cpp/oc代码: 1 [self.person setVa ...
- KVC\KVO 简介
KVC\KVO 简介 一.定义: 二.常见方法代码 KVC: KVC进阶用法: KVO: KVO 进阶用法: 三.用处 KVC: KVO: 四.MVVM.MVVMM架构 一.定义: KVC 是OC一个 ...
- Ios KVC KVO
一.KVC与KVO *"KVC":key value Coding(键值编码) *目的:间接的修改或获取对象的属性,降低程序(类与类)之间的耦合度. *"KVO" ...
最新文章
- HDU 6741 MUV LUV UNLIMITED (博弈论)
- WEB前端 深入了解JavaScript ajax—XHR对象
- python端口扫描工具_Python实现的多线程端口扫描工具分享
- php 连接sap rfc 乱码,[RFC] sap rfc调用时判断连接状态
- CentOS 安装 rz sz
- JAVA导入gpx文件_使用传单加载多个gpx文件
- 预测(评价)模型——层次分析法*
- impalahive大数据平台数据血缘与数据地图(四)-impala血缘架构图及功能介绍
- 离散时间傅里叶变换(一)
- linux缺省的shell,Linux操作系统缺省的shell
- 2021-05-01微信小程序存储数据的几种方式
- 英国脱离欧盟Brexit目前票数:脱欧阵营51.4%领先!!!
- 淘客基地淘客小程序系统更新至1.2.4 版本
- FreeSwitch连接语音网关配置及使用场景
- excel 删除重复项_在Excel 2013列表中删除重复项
- 二十一世纪大学英语读写基础教程学习笔记(原文)——3 - Mothers(母亲)
- Linux 安装python 3.8(Linux 的版本为 Centos 7)
- 【计算机基础】中英文常用名词对照
- 炒币经验分享给大家,希望对你们有帮助。
- 在手机开发中常用的数据库是什么?