Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 键值编码与多个关系_Objective C_Cocoa_Macos_Gnustep - Fatal编程技术网

Objective c 键值编码与多个关系

Objective c 键值编码与多个关系,objective-c,cocoa,macos,gnustep,Objective C,Cocoa,Macos,Gnustep,我对键值编码和许多关系有点困惑。我已经读到,当有这样的关系时,我应该使用[object-mutableArrayValueForKey:@“key”];取回 保存该有序关系中的对象的可变数组 我不明白的是可变数组值forkey和 瓦卢福基 让我用一个例子来说明(array是一个NSMutableArray,作为属性自设置): 两个调用返回的结果完全相同。在这种情况下,第二种方法有什么好处或不同 干杯 第一个元素实际上是objectAtIndex:0,而不是objectAtIndex:1 另外,第

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

我不明白的是可变数组值forkey和 瓦卢福基

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

两个调用返回的结果完全相同。在这种情况下,第二种方法有什么好处或不同


干杯

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


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

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
有关代理如何工作的详细信息,请阅读for
mutableArrayValueForKey
。在这种特殊情况下,您碰巧有一个真正的NSMutableArray作为ivar。但如果没有这样的ivar呢?您可以使用
countOf
objectionandex:
等方法,在不使用ivar支持属性的情况下实现KVC。只要您能够向KVC方法返回合理的结果,就没有规则要求存在实际的“数组”ivar

但是,如果您想公开一个NSMutableArray接口,但没有真正的NSMutableArray,该怎么办?这就是
mutableArrayValueForKey
的用途。它返回一个代理,当被访问时,该代理将转换为KVC方法返回给您,包括将您发送到许多方法,如
insertObject:inandex:


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

是的,我知道第一个元素是0。代码并不意味着这是第一次。第二点是有道理的,但这是唯一的优势吗?它返回一个可变数组?为什么(如果原始对象是NSMutableArray)valueForKey不返回可变数组?此外,如果您编写(NSMutableArray*)数组;方法返回一个NSMutableArray,然后第一个调用将实际获得一个可变数组,因此它将能够使用addObject:代码说
NSLog(@“first element%@”,…)
,然后记录第二个元素。好吧,NSLog是错误的,但实际上,在这个数组中有一堆NSString用于详细解释!
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