iPhone中的应用程序崩溃问题

时间:2010-09-07 19:03:39

标签: iphone plist

我使用过NSMutable Dictionary和NSMutable Array。使用NSMrray of NSMutable Dictionary从plist(文档目录)存储和检索数据。

     Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray removeObjectAtIndex:]: mutating method sent to immutable object' 

请指导我为什么会这样?

谢谢!

3 个答案:

答案 0 :(得分:2)

如果您发布导致的确切代码,它可能会有所帮助。我的猜测是,当您使用NSMutableDictionary时,对valueForKey:的调用会向您返回一个不可变的NSArray,您认为它会返回NSMutableArray个实例。请注意,可变数组和字典允许您操作其中的项集合,但不保证这些项本身是可变的。例如,如果您检查Property List Programming Guide: Reading and Writing Property-List Data,您会注意到以下示例:

  

如果您使用加载属性列表   这个电话:

     

NSMutableArray * ma = [NSMutableArray arrayWithContentsOfFile:xmlFile];

     

ma是一个具有不可变的可变数组   每个元素中的字典。每把钥匙   每个字典中的每个值都是   不可变的。

如果您需要明确控制每个级别对象的可变性,请使用propertyListFromData:mutabilityOption:format:errorDescription:

您还可以从NSMutableArray获得的NSArray创建明确的NSMutableDictionary副本。

答案 1 :(得分:0)

你说你正在以NSArray的形式检索数组,而不是在尝试为它删除对象之前将其转换为NSMutableArray。这会导致错误,因为您无法从NSArray

中删除对象

答案 2 :(得分:0)

假设[something dictionaryValue]返回一个不可变字典,并且您想要该字典的可变版本。仅仅说:

NSMutableDictionary *d = [something dictionaryValue];

这只是告诉编译器d是一个NSMutableDictionary,但实际上它是从[something dictionaryValue]获得的同一个不可变字典。相反,您需要创建一个新的,可变的字典副本:

NSMutableDictionary *d = [NSMutableDictionary dictionaryWithDictionary:
                                              [something dictionaryValue]];

同样,对数组使用[NSMutableArray arrayWithArray:...]