iOS 的KVC技术比较常用,可在运行时动态地对一个对象的属性赋值,并且如果该key
是有添加KVO监听
, 也会触发这个监听。下面是KVC的实现原理总结。
一、KVC的设值原理
kvc设值原理.png
根据上图可以很清晰的知道KVC的设值过程。假设要设值的属性名为key
1> 当调用setValue:forKey:
或者setValue:forKeypath:
方法时,是首先查找对象方法 setKey:
,如果有则直接调用,就此完成了KVC; 如果没有这个方法则查找_ setKey:
方法调用,完成KVC。
2> 当上述2个方法都未找到,则调用对象的类方法 accessInstanceVariablesDirectly
的返回值,如果为NO, 表示不允许访问成员变量,则抛出异常如上图; 如果为YES, 则查找是否存在可以设置的成员变量,按照_key
、_isKey
、key
、isKey
顺序查找,找到了一个就不用继续往后查找了,直接对该成员变量赋值完成KVC,如果没有找到,则抛出如图异常。
二、KVC的取值原理
KVC的取值过程如图,假设要取值的属性为
key
。1> 当调用
valueForkey:
方法时,首先按照顺序getKey
、key
、isKey
、_key
查找对象方法,如果找到了方法,则调用方法拿到返回值即完成KVC取值.
2> 如果上述方法都没有找到,则调用对象的类方法 accessInstanceVariablesDirectly
的返回值,如果为NO, 表示不允许访问成员变量,则抛出异常如上图; 如果为YES, 则查找是否存在可以取值的成员变量,按照_key
、_isKey
、key
、isKey
顺序查找,找到了一个就不用继续往后查找了,直接取该成员变量完成KVC取值,如果没有找到,则抛出如图异常。
以上完结
网友评论