美文网首页
对KVC读取顺序的理解

对KVC读取顺序的理解

作者: Mr_wick | 来源:发表于2021-05-17 17:57 被阅读0次

KVC用了这么久,是时候总结一下kvc的原理了。
kvc通过key直接访问对象的属性,或者给对象的属性直接赋值,因此在运行时动态的访问和修改对象的属性。
赋值方式:setValue:forKey: 譬如:[person setValue:@"wick" forKey:@"name"];
其底层逻辑为:
1、优先调用setName:属性值方法,找到setter方法完成赋值。
2、若找不到setName方法,kvc机制则检测+(BOOL)accessInstanceVariablesDirectly方法有没有返回YES,默认为YES。若返回YESkvc继续搜索有无名为name的成员变量。若重写该方法,返回NO,则此刻会调用-setValue: forUndefinedKey:
3、若未找到setName方法,也未找到_name成员变量,kvc则开始搜索_isName的成员变量
4、如果以上方式都不命中,则kvc会执行-setValue: forUndefinedKey:
如果想禁用kvc,则+(BOOL)accessInstanceVariablesDirectly返回NO即可

取值方式:valueForKey:譬如:[person valueForKey:@"name"]
底层逻辑如下:
1、按照搜索顺序getNamenameisName查找getter方法。
2、如果以上getter方法未命中,则会查找countOf:@"name"objectIn:@"name" atIndex:@"" atIndexes方法。如果以上三个方法找到,则返回一个NSArray的子类--NSKeyValueArray
3、如果以上方法未找到,会同时查找countOf:@"name"enumeratorOf:@"name"memberOf:@"name",如果查找到,则返回一个NSSet所有的方法代理集合。
4、如果仍未找到,则检查+(BOOL)accessInstanceVariablesDirectly返回YES则按_name,_isName,name,isName的顺序搜索变量名。如果返回NO,则直接调-valueForUndefinedKey:结束

相关文章

  • 对KVC读取顺序的理解

    KVC用了这么久,是时候总结一下kvc的原理了。kvc通过key直接访问对象的属性,或者给对象的属性直接赋值,因此...

  • iOS -- KVC底层剖析及应用场景

    KVC底层剖析及应用场景 1.方法介绍 2.调用顺序--读取部分 下面做了简单的调用顺序验证,代码没技术含量,看看...

  • 19.iOS底层学习之iOS底层学习之KVC

    本篇提纲1、KVC的基本介绍2、KVC的API3、KVC的写入过程4、KVC的读取过程5、自定义KVC KVC的基...

  • KVC

    KVC 1、 KVC - Key Value Coding键值(路径)编码 2、KVC是一种间接修改/读取对象属性...

  • 类添加属性的方法

    1、KVC,通过keyPath设置和读取(也可设置和读取一些未暴露的私有变量) KVC是怎么寻找Key的当调用se...

  • KVC

    KVC基本使用 KVC赋值 按照setKey: -> _setKey ->的顺序查找方法,如果上述方法不存在,判断...

  • iOS 对KVC、KVO理解

    什么是KVC KVC键值编码,允许通过key名直接访问对象的属性或者给对象的属性赋值,而不需要调用对象的存取方法。...

  • KVC查找顺序

    KVC set get

  • KVC的查找顺序

    赋值顺序 取值顺序

  • KVC的查询顺序

    一、自定义一个TestObject类,测试KVC取值的查询顺序 以下是TestObject的源码,你没看错,就是这...

网友评论

      本文标题:对KVC读取顺序的理解

      本文链接:https://www.haomeiwen.com/subject/siwjjltx.html