最近在做的项目中,需要与NSUserDefaults打交道,比如NSUserDefaults里某个值变更时,需要对其重新save,但在重新save时发生crash,crash log如下:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFDictionary removeObjectForKey:]: mutating method sent to immutable object'
网上google了下答案,最终在stackOverFlow里找到了答案,爱死stackOverFlow了,哈哈
http://stackoverflow.com/questions/10260797/removing-an-object-from-a-mutable-dictionary-throws-an-exception
错误的代码:
+(void)removeItemFromUserDefault:(NSString *)item_id //将宝贝从UserDefault里删除
{
NSUserDefaults * userDefault = [NSUserDefaultsstandardUserDefaults];
NSMutableDictionary * dictionary = [userDefault dictionaryForKey:DHK_DATA];
[dictionary removeObjectForKey:item_id];
[self saveArray2UserDefault:dictionary];
}
正确的代码:
+(void)removeItemFromUserDefault:(NSString *)item_id //将宝贝从UserDefault里删除
{
NSUserDefaults * userDefault = [NSUserDefaultsstandardUserDefaults];
NSMutableDictionary * dictionary = [[userDefault dictionaryForKey:DHK_DATA]mutableCopy];
[dictionary removeObjectForKey:item_id];
[self saveArray2UserDefault:dictionary];
}
出错的原因在于,通过[userDefaultdictionaryForKey:DHK_DATA]返回的是一个nsdictionary,而这个类对应的对象是不具备删除功能的,所以crash了。
改为 NSMutableDictionary * dictionary = [[userDefaultdictionaryForKey:DHK_DATA]mutableCopy]将返回的nsdictionary复制一个可变的副本,也就具有删除功能了。