3

我对键值编码和多对多关系有点困惑。我读过,当有这样的关系时,我应该使用 [object mutableArrayValueForKey:@"key"]; 检索以该有序关系保存对象的可变数组。

我不明白 mutableArrayValueForKey 或 valueForKey 之间有什么区别。

让我用一个例子来说明(数组是一个自设置为属性的 NSMutableArray):

id array1= [self valueForKey:@"array"];

NSLog(@"first element %@",[array1 objectAtIndex:1]);

id array2 = [self mutableArrayValueForKey:@"array"];

NSLog(@"first element %@",[array2 objectAtIndex:1]);

两个调用返回完全相同。在那种情况下,第二个有什么好处或不同?

干杯!

4

2 回答 2

6

mutableArrayValueForKey不返回“array”,它返回“array”的代理。如果您打印出类,您可以看到这一点:

NSLog(@"%@", [self.array class]);
NSLog(@"%@", [[self valueForKey:@"array"] class]);
NSLog(@"%@", [[self mutableArrayValueForKey:@"array"] class]);

这打印:

2010-02-24 20:06:44.258 Untitled[25523:a0f] NSCFArray
2010-02-24 20:06:44.275 Untitled[25523:a0f] NSCFArray
2010-02-24 20:06:44.276 Untitled[25523:a0f] NSKeyValueSlowMutableArray

阅读文档mutableArrayValueForKey获取有关该代理如何工作的详细信息。在这种特殊情况下,您碰巧有一个真正的 NSMutableArray 作为 ivar。但是,如果没有这样的 ivar 怎么办?countOf<Key>您可以在没有 ivar 支持属性的情况下使用和之类的方法来实现 KVC objectIn<Key>AtIndex:。只要您可以将合理的结果返回给 KVC 方法,就没有实际存在“数组”ivar 的规定。

但是如果你想公开一个 NSMutableArray 接口,但你没有真正的 NSMutableArray 怎么办?这mutableArrayValueForKey就是为了。它返回一个代理,当访问该代理时,该代理将转换为 KVC 方法返回给您,包括向您发送变异为许多方法,例如insertObject:in<Key>AtIndex:.

这甚至发生在你有一个真正的 ivar 的情况下(就像你的情况一样),你只是没有注意到它,因为代理的行为非常像真实的对象。

于 2010-02-25T01:17:10.560 回答
0

第一个元素实际上是objectAtIndex:0,不是objectAtIndex:1

此外,第二种方法确保您可以使用 and 修改返回的数组addObject:removeObjectAtIndex:即使键的值@"array"是不可变数组。

于 2010-02-25T00:51:36.633 回答