KVC 键值编程的搜索模式

来源:互联网 发布:个人淘宝打假赚钱 编辑:程序博客网 时间:2024/06/03 13:10

键值属性

是一种访问属性的键值对机制,其中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:默认的搜索顺序

  1. KVC从receiver([receiver massage])的类中查询访问方法set<Key>
  2. 如果set<Key>未找到,且receiver的类方法accessInstanceVariablesDirectly返回YES,则receiver依次搜索名字为_<key>, _is<Key>, <key>, is<Key>,的实例变量,注意搜索顺序。
  3. 如果找到了访问方法或者实例变量,则利用其设置对应的value。
  4. 如果既没有搜索到访问方法,也没有找到实例变量,则receiver会调用 setValue:forUndefinedKey: 方法

KVCsetValue搜索顺序

valueForKey:默认的搜索模式

  1. 首先按get<Key>、<key>、is<Key>的顺序查找getter方法,找到直接调用。
    1. 若方法的返回结果类型为是一个对象指针,则直接返回结果;
    2. 若类型为能够转化为NSNumber的标量,做NSNumber转换后返回;
    3. 否则,转换为NSValue返回。
  2. 上面的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:方法,给方法也会用于性能优化。
  3. 还没查到,那么查找countOf<Key>、enumeratorOf<Key>、memberOf<Key>:格式的方法。如果这三个方法都找到,那么就返回一个可以响应NSSet所有方法的集合代理(collection proxy object)。发送给这个代理集合(collection proxy object)的NSSet消息方法,就会以countOf<Key>、enumeratorOf<Key>、memberOf<Key>:组合的形式调用。
  4. 还是没查到,那么如果类方法accessInstanceVariablesDirectly返回YES,那么按_<key>,_is<Key>,<key>,is<Key>(注意大小写)的顺序直接搜索实例变量。如果搜索到了,则返回receiver相应实例变量的值。返回结果的处理见步骤1。
  5. 再没查到,调用valueForUndefinedKey:

流程图有机会加上

有序集合的搜索模式(NSMutableArray)

唯一有序集合(?)的搜索模式()

无序集合的搜索模式(NSMutableSet)

0 0
原创粉丝点击