NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *arr = [defaults objectForKey:@"MyCity"];
[self.cityArr addObjectsFromArray:arr];
for (NSString *myCity in self.cityArr) {
if (![myCity isEqualToString:city.cityName]) {//数组中的城市不和现在选中的城市重复
[self.cityArr insertObject:city.cityName atIndex:0];
}
}
1、NSCFArray insertObject:atIndex:]: mutating method sent to immutable obje
出错语句:[self.cityArr insertObject:city.cityName atIndex:0];
用NSUserdefaults保存的数组赋值给了一个可变数组A,但是在插入元素或增加时,crash掉了。
原因是可变数组A被赋值了一个不可变数组B,此时数组A就成了不可变的,此时再对其修改,就会出错。
解决方法:再声明一个可变数组,将开始的数组赋值给新的可变数组
NSMutableArray *newCityArr = [NSMutableArray arrayWithArray:self.cityArr];
for (NSString *myCity in newCityArr) {
if (![myCity isEqualToString:city.cityName]) {//数组中的城市不和现在选中的城市重复
[newCityArr insertObject:city.cityName atIndex:0];
}
}
2、按照上面的方法修改后还是crash了。。。
此时错误信息为
Collection <__NSArrayM: 0x> was mutated while being enumerated.
原因:
被遍历的数组不能被修改
即,遍历newCityArr的内容,就不能修改它。
解决方法:此时newCityArr
和self.cityArr的内容是一样的,所以可以遍历self.cityArr,修改newCityArr
如下:
NSMutableArray *newCityArr = [NSMutableArray arrayWithArray:self.cityArr];
for (NSString *myCity in self.cityArr) {
if (![myCity isEqualToString:city.cityName]) {//数组中的城市不和现在选中的城市重复
[newCityArr insertObject:city.cityName atIndex:0];
}
}
关于错误
-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object' 解决方法
原因:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *dic = [defaults objectForKey:@"dic"];
[dic setObject:[NSNumber numberWithInteger:num] forKey:currentTime];
此时dic被赋值了不可变字典,所以不能再对它进行可变操作
修改如下:
NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary:[defaults objectForKey:@"dic"]];