KVC原理

描述

Key-value coding is a mechanism enabled by the NSKeyValueCoding informal protocol that objects adopt to provide indirect access to their properties.

kvc 是由NSKeyValueCoding非正式协议采用的一种机制,对象通过该协议来提供属性的间接访问

image.png
image.png

执行结果为

IFLArchitecture[15333:450053] -[IFLKVCObject setName:] -- name: kvc_name1

根据测试,发现 setValue forKey, 会先判断是否含有setName, 有的话执行 setName

否则,判断有无 _setName ,有的话执行 _setName

如果 key不存在的话,

执行 - (void)setValue:(id)value forUndefinedKey:(NSString *)key

accessInstanceVariablesDirectly

image.png
image.png
image.png

如果 accessInstanceVariablesDirectly 返回YES

则 setValue forKey 根据 _ _is is 的顺序查找变量进行设置

如果 accessInstanceVariablesDirectly 返回NO

则 setValue forKey 将执行 setValue: forUndefinedKey:

现在把set的方法全都注释掉,看下成员变量 name们的值

image.png
image.png
image.png
image.png

发现就 _name有值

注释掉 _name 继续测试

image.png
image.png

此时 _isName 有值

注释掉 _isName 继续测试

image.png
image.png

此时 name 有值

注释掉 name 继续测试

image.png
image.png

此时 isName有值

set方法的执行顺序

image.png

如果我们通过注释测试,发现

set执行顺序为 set _set setIs

value设置的顺序为 _ _is is

get方法执行顺序

image.png
image.png
image.png

注释掉 set get

image.png
image.png

取值结果为null

因为取值顺序为 _ _is is

自定义KVC流程

自定义实现说白了就是对前面 key的拼接 大小写处理 判断方法实现

自定义setValue forKey

image.png
  • 顺序判断set _set setIs 是否实现

  • 判断 accessInstanceVariablesDirectly 是否允许直接访问实例变量

  • 顺序查找 _ _is is 实例变量

  • object_setIvar 实例变量赋值

image.png

自定义 getValueForKey 与 set大同小异

image.png

kvc自定义实现代码

你可能感兴趣的:(KVC原理)