iOS中KVC的理解

177 阅读3分钟
 KVC是KeyValue Coding的简称,它是一种可以直接通过字符串的名字(key)来访问类属性的机制。而不是通过调用Setter、Getter方法访问。


(设值) setValue: forKey: 调用顺序 

(下面的<key>是指成员变量名,首字母大小写要符合KVC的命名规则) 

 1.先调用set<Key>:如果有设置完成 ,如果没有找到 接着会执行 setIs<key>: 如果有设置完成 

 2.如果没有相关方法:看 + (BOOL)accessInstanceVariablesDirectly 返回值 (是否直接访问实例变量) 

   YES : 找成员变量,先后顺序是 _<key> -> _is<key> -> <key> - > is<key> 如果找到则完成赋值 

    NO : setValue:forUndefinedKey:(抛出异常) 

3.如果上面列出的方法或者成员变量都不存在,系统将会执行该对象的setValue:fo rUndefinedKey:方法,默认是抛出异常。 

   当对非类对象属性设置nil时,调用([p setValue:nil forKey:@"name"]) 系统将会执行该对象的- (void)setNilValueForKey:(NSString *)key方法, 默认是抛出异常 

 (取值)valueForKey:调用顺序 

1.先调用相关方法,先后顺序是: 

 getter方法:get<key> -> <key> -> is<key> 

 NSArray方法: countOf<key> 和 objectIn<Key>AtIndex 

2.如果没有相关方法:看 + (BOOL)accessInstanceVariablesDirectly 返回值 

 YES : 找成员变量,先后顺序是 _<key> -> _is<key> -> <key> -> is<key> 

 NO : valueForUndefinedKey:(抛出异常) 

3.如果上面列出的方法或者成员变量都不存在,系统将会执行该对象的valueForUnd efinedKey:方法,默认是抛出异常

// 集合运算符  @count @max

  • @count:返回一个值为集合中对象总数的NSNumber对象。
  • @sum:首先把集合中的每个对象都转换为double类型,然后计算其总,最后返回一个值为这个总和的NSNumber对象。
  • @avg:首先把集合中的每个对象都转换为double类型,然后计算其平均值,最后返回一个值为该平均值的NSNumber对象。
  • @max:使用compare:方法来确定最大值。所以为了让其正常工作,集合中所有的对象都必须支持和另一个对象的比较。
  • @min:和@max一样,但是返回的是集合中的最小值。
  •     @distinctUnionOfObjects: 返回一个由操作符右边的key path所指定的对象属性组成的数组。其中@distinctUnionOfObjects会对数组去重

         @unionOfObjects不会。

  • @distinctUnionOfArrays/@unionOfArrays: 返回了一个数组,其中包含这个集合中每个数组对于这个操作符右面指定的key path进行操作之后的值。正如你期望的,distinct版本会移除重复的值。
  • @distinctUnionOfSets:和@distinctUnionOfArrays差不多, 但是它期望的是一个包含着NSSet对象的NSSet
    ,并且会返回一个NSSet对象。因为集合不能包含重复的值,所以它只有distinct操作。