键值属性
是一种访问属性的键值对机制,其中key是属性的名称,value是属性的值。
- 通过KVC可以减少代码量,在需要根据变量访问指定属性时尤其如此。
- 降低耦合性。
Key-value coding attempts to use accessor methods to get and set values, before resorting to directly accessing the instance variable.
KVC会首先尝试使用accessor methods(getter/setter)方法来访问属性的值,若未找到,然后才是直接访问实例变量(instance variable)。
简单属性的搜索模式
setValue:forKey:默认的搜索顺序
- KVC从receiver(
[receiver massage]
)的类中查询访问方法set<Key>
。 - 如果
set<Key>
未找到,且receiver的类方法accessInstanceVariablesDirectly返回YES,则receiver依次搜索名字为_<key>, _is<Key>, <key>, is<Key>,
的实例变量,注意搜索顺序。 - 如果找到了访问方法或者实例变量,则利用其设置对应的value。
- 如果既没有搜索到访问方法,也没有找到实例变量,则receiver会调用 setValue:forUndefinedKey: 方法
valueForKey:默认的搜索模式
- 首先按
get<Key>、<key>、is<Key>
的顺序查找getter方法,找到直接调用。
- 若方法的返回结果类型为是一个对象指针,则直接返回结果;
- 若类型为能够转化为NSNumber的标量,做NSNumber转换后返回;
- 否则,转换为NSValue返回。
- 上面的getter没有找到,查找
countOf<Key>、objectIn<Key>AtIndex:、<Key>AtIndexes
格式的方法。
如果countOf<Key>
和另外两个方法中的一个找到,那么就会返回一个可以响应NSArray所有方法的集合代理(collection proxy object)。发送给这个代理集合(collection proxy object)的NSArray消息方法,就会以countOf<Key>、objectIn<Key>AtIndex:、<Key>AtIndexes
这几个方法组合的形式调用。如果receiver的类实现了get<Key>:range:
方法,给方法也会用于性能优化。 - 还没查到,那么查找
countOf<Key>、enumeratorOf<Key>、memberOf<Key>:
格式的方法。如果这三个方法都找到,那么就返回一个可以响应NSSet所有方法的集合代理(collection proxy object)。发送给这个代理集合(collection proxy object)的NSSet消息方法,就会以countOf<Key>、enumeratorOf<Key>、memberOf<Key>:
组合的形式调用。 - 还是没查到,那么如果类方法accessInstanceVariablesDirectly返回YES,那么按
_<key>,_is<Key>,<key>,is<Key>
(注意大小写)的顺序直接搜索实例变量。如果搜索到了,则返回receiver相应实例变量的值。返回结果的处理见步骤1。 - 再没查到,调用
valueForUndefinedKey:
。
流程图有机会加上