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相关推荐

  1. zzz KVC/KVO原理详解及编程指南

    前言: 1.本文基本不讲KVC/KVO的用法,只结合网上的资料说说对这种技术的理解. 2.由于KVO内容较少,而且是以KVC为基础实现的,本文将着重介绍KVC部分. 一.简介 KVC/KVO是观察者模 ...

  2. KVC/KVO原理详解及编程指南

    作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注 ...

  3. KVO(NSKeyValueObserving)、KVC(NSKeyValueCoding)作用浅谈

    [iOS] KVO(NSKeyValueObserving).KVC(NSKeyValueCoding)作用浅谈 在很多时候接触到很多地方都有对KVC,KVO的描述,但是都是一笔带过.只知道这是Obj ...

  4. 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态

    一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...

  5. KVC/KVO 使用细节和调用顺序

    Key-Value Coding (KVC) Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一个非正式的 Protocol,提供一种机制来间接访问对象 ...

  6. KVC/KVO 本质

    KVO 的实现原理 KVO是关于runtime机制实现的 当某个类的对象属性第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法.派生类 ...

  7. KVC/KVO实现原理分析

    2019独角兽企业重金招聘Python工程师标准>>> 1. 函数调用(消息)实现分析: 我们看这条语句: [代码]c#/cpp/oc代码: 1 [self.person setVa ...

  8. KVC\KVO 简介

    KVC\KVO 简介 一.定义: 二.常见方法代码 KVC: KVC进阶用法: KVO: KVO 进阶用法: 三.用处 KVC: KVO: 四.MVVM.MVVMM架构 一.定义: KVC 是OC一个 ...

  9. Ios KVC KVO

    一.KVC与KVO *"KVC":key value Coding(键值编码) *目的:间接的修改或获取对象的属性,降低程序(类与类)之间的耦合度. *"KVO" ...

最新文章

  1. HDU 6741 MUV LUV UNLIMITED (博弈论)
  2. WEB前端 深入了解JavaScript ajax—XHR对象
  3. python端口扫描工具_Python实现的多线程端口扫描工具分享
  4. php 连接sap rfc 乱码,[RFC] sap rfc调用时判断连接状态
  5. CentOS 安装 rz sz
  6. JAVA导入gpx文件_使用传单加载多个gpx文件
  7. 预测(评价)模型——层次分析法*
  8. impalahive大数据平台数据血缘与数据地图(四)-impala血缘架构图及功能介绍
  9. 离散时间傅里叶变换(一)
  10. linux缺省的shell,Linux操作系统缺省的shell
  11. 2021-05-01微信小程序存储数据的几种方式
  12. 英国脱离欧盟Brexit目前票数:脱欧阵营51.4%领先!!!
  13. 淘客基地淘客小程序系统更新至1.2.4 版本
  14. FreeSwitch连接语音网关配置及使用场景
  15. excel 删除重复项_在Excel 2013列表中删除重复项
  16. 二十一世纪大学英语读写基础教程学习笔记(原文)——3 - Mothers(母亲)
  17. Linux 安装python 3.8(Linux 的版本为 Centos 7)
  18. 【计算机基础】中英文常用名词对照
  19. 炒币经验分享给大家,希望对你们有帮助。
  20. 在手机开发中常用的数据库是什么?

热门文章

  1. 算法 --- reduce的使用.
  2. ES5-拓展 原型链、继承、类
  3. JavaScript 标准参考教程-阅读总结(三)
  4. WINHEX的比较、同步功能加上NTFS对稀疏文件的支持
  5. django项目中settings.py文件中路径设置问题
  6. 对VS2008生成智能win32程序简单理解
  7. 机器视觉工业镜头-Computar
  8. HALCON示例程序hull.hdev区域提取与凸度筛选
  9. vxworks的default boot line说明
  10. 【图像处理】——图像内插法