【问题标题】:mutableArrayValueForKey NSMutableArray crash when removing objects移除对象时 mutableArrayValueForKey NSMutableArray 崩溃
【发布时间】:2014-07-11 21:04:16
【问题描述】:

我在使用以下代码时遇到了崩溃。 self.itemsNSManagedObjectsNSArray,具有 String 类型的 "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 = ....

在调试器中打印出来会发现allIDNSKeyValueSlowMutableArray,而不是常规NSMutableArray__NSArrayM

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    来自NSKeyValueCoding 协议参考

    mutableArrayValueForKey:

    返回一个可变数组代理,该代理提供对 由给定键指定的有序对多关系。

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

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

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

    【讨论】:

    • 这样就搞定了。我的困惑是认为mutableArrayValueForKey:valueForKey: 的可变版本相同。
    • 是的,我认为第一次出现本质上是混乱的。
    猜你喜欢
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多