Iphone KVC生成的阵列中超出范围

Iphone KVC生成的阵列中超出范围,iphone,objective-c,key-value-coding,Iphone,Objective C,Key Value Coding,我试图从其他对象的层次结构中创建一个对象数组,如下所示: 代码1: childController.names = [[NSMutableArray alloc] init]; for (Person *p in list.persons) { [childController.names addObject:p.name]; } 代码2: NSMutableArray *testArray = [list.persons valueForKey:@"name"]; 第一个代码段工

我试图从其他对象的层次结构中创建一个对象数组,如下所示:

代码1:

childController.names = [[NSMutableArray alloc] init];

for (Person *p in list.persons) {
    [childController.names addObject:p.name];
}
代码2:

NSMutableArray *testArray = [list.persons valueForKey:@"name"];
第一个代码段工作正常,返回一组人名。相反,第二个返回一个具有正确人名数量的数组,但是当我在XCode中调试代码时,它们显示为“超出范围”。当我尝试访问其中一个应用程序时,该应用程序会以以下方式终止:

由于未捕获而终止应用程序 例外 “NSInvalidArgumentException”,原因: '***-[NSCFSet objectAtIndex:]: 已将无法识别的选择器发送到实例 0x72e0620'


列表中,人员是核心数据管理对象(如果重要的话)。。我做错了什么?

你应该检查
人员的类型。它似乎是一个
NSSet
,而
NSSet
上的
valueForKey:
将返回一个
NSSet
。此代码段应按预期工作:

NSSet* testSet = [list.persons valueForKey:@"name"];

另外,如果您的
names
属性是
retain
属性,那么当您使用
[[nsmuataablearray alloc]init]
设置它时,您正在泄漏(在设置属性后,您将有+2个retain count)。嗯,您能解释一下吗?正确的方法是什么?谢谢