15,确保KVC承诺:
16,如果属性是单一值:
1)实现-<Key> -is<Key>或有实例变量: <key>或_<key>
2)如果属性是可变的,还应该实现-set<Key>
3)-set<key>不应该执行验证。
4)应该实现-validate<Key>:error: 如果验证适合键。
17,索引为多值:
对索引的多值属性:
1)实现 -<key>
2)或者有实例变量 <key>或_<key>
3)或者实现-countOf<key>和-objectIn<Key>AtIndex: 或-<key>AtIndexes:中的一个
4)可选地,你可以实现-get<Key>:range:来提升性能。
对可变的索引有序的多值属性,KVC承诺要求你的类
1)实现 –insertObject:in<Key>AtIndex或-insert<Key>:atIndexes:中的一个
2)实现 –removeObjectFrom<Key>AtIndex: 或 –remove<Key>AtIndexes中的一个。
3)可选地,你可以实现-replaceObjectIn<Key>AtIndex:withObject或-replace<Key>AtIndexes:with<Key>来提升性能。
18,无序多值属性:
对无序多值属性:
1)实现-<key>
2)或有实例变量:<key> or _<key>
3)或实现-countOf<Key>, -enumeratorOf<Key>, and -memberOf<Key>:.
For a mutable unordered to-many relationship, KVC compliance requires that your class also
对可变无序多值属性:
1)实现后面2个方法中的一个: -add<Key>Object: or -add<Key>:.
2)实现后面2个方法中的一个: -remove<Key>Object: or -remove<Key>:.
3)可选的,你可以实现 -intersect<Key>: and -set<Key>: 来提升性能。
19,标量和结构支持:
默认的实现valueForKey:和setValue:forKey:会自动包装非对象类型,包括标量和结构类型。
一旦valueForKey:已经决定了特定的访问方法或实例变量,它会检查返回类型,如果不是对象,NSNumber和NSValue对象被创建并包装非对象值。
类似的,setValue:forKey 会自动将NSValue或NSNumber对象的xxxValue取出并赋值给属性。
20,处理nil值:setValue:forKey 如果设置nil值给一个非对象属性,接收者发送一个setNilValueForKey消息,默认这会引起一个NSValidArgumentException异常。子类化可以重载该行为。
21,包装和解包装标量值:
22,集合操作符:
所有的集合操作符,除了@count,都要求一个keyPath在操作符的右侧。
1)@avg
2)@count
3)@max:取最大值,如果参与比较的值是nil,则忽略该值。
4)@min:同样忽略nil值
5)@sum:同样忽略nil值
23,对象操作符:
1)@distinctUnionOfObjects:例子:返回
NSArray *payees = [transactions valueForKeyPath:@"@distinctUnionOfObjects.payee"];
2)@unionOfObject:
重要提示:这2个操作符 如果任意的叶对象值为nil,则引起异常。
24,数组和设置操作符:
首先准备数组:
// Create the array that contains additional arrays.
self.arrayOfTransactionsArray = [NSMutableArray array];
// Add the array of objects used in the above examples.
[arrayOfTransactionsArray addObject:transactions];
// Add a second array of objects; this array contains alternate values.
[arrayOfTransactionsArrays addObject:moreTransactions];
1)@distinctUnionOfArrays:返回一个数组,包含distinct对象,如:
NSArray *payees = [arrayOfTransactionsArrays valueForKeyPath:@"@distinctUnionOfArrays.payee"];
2)unionOfArrays:
3)distinctUnionOfSets:
25,访问器搜索实现细节:
26,访问器搜索简单属性的格式:
27,setValue:forKey:的搜索格式:
1)首先查找访问方法 set<Key>:
2) 如果没找到,如果接收者的类方法accessInstanceVariablesDirectly返回YES,接收者搜索实例变量_<key>, is<Key> <key>或is<key>,按照这个顺序查找
3)如果找到了,则使用其来设置值。
4)如果没有找到,调用setValue:forUndfinedKey:
28,valueForKey:的默认搜索格式:
1)按顺序搜索接收者的访问方法 get<Key> <key> 或is<Key>。如果找到,则被调用。
2)否则,搜索接收者的方法countOf<key>、 objectIn<Key>AtIndex: 和 <key>AtIndexes: 如果countOf<Key>方法和至少另外两个可能的方法中找到任意一个,一个集合代理对象响应所有NSArray方法 被返回。
3)否则,超找接收这的countOf<key>、enumeratorOf<key>和memberOf<Key>。如果3个方法都被找到,一个集合代理对象响应所有的NSSet方法 被返回。
4)否则,如果接收者的类方法accessInstanceVariablesDirectly为YES,接收者的类搜索实例变量 _<ke