我使用过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'
请指导我为什么会这样?
谢谢!
答案 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:...]
。