我对键值编码和多对多关系感到困惑。我已经读过,当我有这样的关系时,我应该使用[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]);
两个调用返回完全相同。在这种情况下,第二个的好处或不同之处是什么?
干杯!
答案 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"
的值是不可变数组也是如此。