描述
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 根据 _<key> _is<Key> <key> is<Key> 的顺序查找变量进行设置
如果 accessInstanceVariablesDirectly 返回NO
则 setValue forKey 将执行 setValue: forUndefinedKey:
现在把set的方法全都注释掉,看下成员变量 name们的值
发现就 _name有值
注释掉 _name 继续测试
image.png image.png此时 _isName 有值
注释掉 _isName 继续测试
image.png image.png此时 name 有值
注释掉 name 继续测试
image.png image.png此时 isName有值
set方法的执行顺序
image.png如果我们通过注释测试,发现
set执行顺序为 set<Key> _set<Key> setIs<Key>
value设置的顺序为 _<key> _is<Key> <key> is<Key>
get方法执行顺序
image.png image.png image.png注释掉 set get
image.png image.png取值结果为null
因为取值顺序为 _<key> _is<Key> <key> is<Key>
自定义KVC流程
自定义实现说白了就是对前面 key的拼接 大小写处理 判断方法实现
自定义setValue forKey
image.png-
顺序判断set<Key> _set<Key> setIs<Key> 是否实现
-
判断 accessInstanceVariablesDirectly 是否允许直接访问实例变量
-
顺序查找 _<key> _is<Key> <key> is<Key> 实例变量
-
object_setIvar 实例变量赋值
自定义 getValueForKey 与 set大同小异
image.png
网友评论