the*_*ole 3 macos cocoa objective-c gnustep
我对键值编码和多对多关系有点困惑.我已经读过,当我有这样的关系时,我应该使用[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]);
Run Code Online (Sandbox Code Playgroud)
两个调用返回完全相同.在这种情况下,第二个的好处或不同之处是什么?
干杯!
mutableArrayValueForKey不返回"数组",它返回"数组"的代理.如果打印出类,可以看到这个:
NSLog(@"%@", [self.array class]);
NSLog(@"%@", [[self valueForKey:@"array"] class]);
NSLog(@"%@", [[self mutableArrayValueForKey:@"array"] class]);
Run Code Online (Sandbox Code Playgroud)
这打印:
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
Run Code Online (Sandbox Code Playgroud)
阅读文档以mutableArrayValueForKey获取有关该代理如何工作的详细信息.在这种特殊情况下,您碰巧有一个真正的NSMutableArray作为ivar.但如果没有这样的伊娃怎么办?您可以使用类似countOf<Key>和的方法在没有ivar支持属性的情况下实现KVC objectIn<Key>AtIndex:.只要您能够将合理的结果返回到KVC方法,就没有规则存在实际的"阵列"ivar.
但是如果你想暴露一个NSMutableArray接口,但你没有真正的NSMutableArray怎么办?这mutableArrayValueForKey是为了什么.它会返回一个代理,当访问它时会将KVC方法转换回给你,包括向你发送变异到多种方法insertObject:in<Key>AtIndex:.
这甚至发生在你有一个真正的ivar(如你的情况),你只是没有注意到它,因为代理行为非常像真实的对象.
| 归档时间: |
|
| 查看次数: |
944 次 |
| 最近记录: |