3

我正在使用以下代码崩溃。self.items是具有字符串类型属性的 of NSArrayNSManagedObjects"id"

NSMutableArray *allIDs = [self.items mutableArrayValueForKey:@"id"];
NSArray *presentIDs = // a subset of allIDs
[allIDs removeObjectsInArray:presentIDs];

这是崩溃消息:

'Unacceptable type of value for attribute: property = "id"; desired type = NSString; given type = __NSArrayM; value = ....

在调试器中打印出来表明这allID是 aNSKeyValueSlowMutableArray而不是__NSArrayM常规的NSMutableArray.

所以我把它改成了这个,它可以工作:

NSMutableArray *allIDs = [[self.items valueForKey:@"id"] mutableCopy];

这两个调用之间有什么区别会使前者崩溃但后者起作用?我怀疑这与 KVO 和代理集合有关,但不太了解。

4

1 回答 1

2

我怀疑这与 KVO 和代理集合有关,但不太了解。

对,虽然不是 KVO,KVC(键值编码)。

来自NSKeyValueCoding 协议参考

mutableArrayValueForKey:

返回一个可变数组代理,它提供对给定键指定的有序对多关系的读写访问。

换句话说,目的mutableArrayValueForKey:是提供对存储在接收器属性中的不可变数组的可变访问。

另一方面,KVC 提供了valueForKey:for 类型属性的特殊实现,NSArray它使目标数组将valueForKey:消息传播到它的每个元素,并返回一个包含所有结果值的数组。

因此,在您的第二个示例中,发送valueForKey:到 items 数组会导致通过发送valueForKey:@"id"到数组中的每个项目获得的值数组。第一个示例仅在 items 数组本身具有名为id的 type属性时才有效NSArray *

于 2014-05-22T17:41:36.113 回答