我使用以下代码遇到崩溃。 self.items
是NSArray
NSManagedObjects
,其"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
是常规NSKeyValueSlowMutableArray
的{{1}}而不是__NSArrayM
。
所以我把它改成了它并且它起作用了:
NSMutableArray
这两次调用之间的区别是什么会导致前者崩溃,但后者会起作用?我怀疑它与KVO和代理集合有关,但不太了解它。
答案 0 :(得分:2)
我怀疑它与KVO和代理集合有关,但是 不太明白。
对,但不是KVO,KVC(键值编码)。
来自 NSKeyValueCoding Protocol Reference
<强>
mutableArrayValueForKey:
强>返回一个可变数组代理,它提供对一个的读写访问 由给定密钥指定的有序关系。
换句话说,mutableArrayValueForKey:
的目的是提供对存储在接收者属性中的不可变数组的可变访问。
另一方面,KVC为valueForKey:
类型的属性提供了NSArray
的特殊实现,它使目标数组将valueForKey:
消息传播到其每个元素,并返回所有结果值的数组。
因此,在第二个示例中,将valueForKey:
发送到items数组会导致通过将valueForKey:@"id"
发送到数组中的每个项目而获得的值数组。第一个示例仅在项目数组本身具有类型为NSArray *
的名为 id 的属性时才有效。