mutableArrayValueForKey NSMutableArray在删除对象时崩溃

时间:2014-05-22 17:20:45

标签: ios objective-c key-value-observing kvc

我使用以下代码遇到崩溃。 self.itemsNSArray 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和代理集合有关,但不太了解它。

1 个答案:

答案 0 :(得分:2)

  

我怀疑它与KVO和代理集合有关,但是   不太明白。

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

来自 NSKeyValueCoding Protocol Reference

  

<强> mutableArrayValueForKey:

     

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

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

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

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