描述
Key-value coding is a mechanism enabled by the NSKeyValueCoding
informal protocol that objects adopt to provide indirect access to their properties.
kvc 是由NSKeyValueCoding非正式协议采用的一种机制,对象通过该协议来提供属性的间接访问
执行结果为
IFLArchitecture[15333:450053] -[IFLKVCObject setName:] -- name: kvc_name1
根据测试,发现 setValue forKey, 会先判断是否含有setName, 有的话执行 setName
否则,判断有无 _setName ,有的话执行 _setName
如果 key不存在的话,
执行 - (void)setValue:(id)value forUndefinedKey:(NSString *)key
accessInstanceVariablesDirectly
如果 accessInstanceVariablesDirectly 返回YES
则 setValue forKey 根据 _ _is is 的顺序查找变量进行设置
如果 accessInstanceVariablesDirectly 返回NO
则 setValue forKey 将执行 setValue: forUndefinedKey:
现在把set的方法全都注释掉,看下成员变量 name们的值
发现就 _name有值
注释掉 _name 继续测试
此时 _isName 有值
注释掉 _isName 继续测试
此时 name 有值
注释掉 name 继续测试
此时 isName有值
set方法的执行顺序
如果我们通过注释测试,发现
set执行顺序为 set _set setIs
value设置的顺序为 _ _is is
get方法执行顺序
注释掉 set get
取值结果为null
因为取值顺序为 _ _is is
自定义KVC流程
自定义实现说白了就是对前面 key的拼接 大小写处理 判断方法实现
自定义setValue forKey
-
顺序判断set _set setIs 是否实现
-
判断 accessInstanceVariablesDirectly 是否允许直接访问实例变量
-
顺序查找 _ _is is 实例变量
-
object_setIvar 实例变量赋值
自定义 getValueForKey 与 set大同小异