键值编码和多对多关系

时间:2010-02-25 00:39:40

标签: objective-c cocoa macos gnustep

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

我不明白mutableArrayValueForKey或just之间的区别是什么 valueForKey。

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

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

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

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

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

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

干杯!

2 个答案:

答案 0 :(得分: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的{​​{3}},了解有关代理如何运作的详细信息。在这种特殊情况下,您碰巧有一个真正的NSMutableArray作为ivar。但如果没有这样的伊娃怎么办?您可以使用countOf<Key>objectIn<Key>AtIndex:等方法在不使用ivar支持该属性的情况下实施KVC。只要您能够将合理的结果返回到KVC方法,就没有规则存在实际的“阵列”ivar。

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

如果你有一个真正的ivar(如你的情况),你甚至不会注意到它,因为代理的行为与真实对象非常相似。

答案 1 :(得分:0)

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

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