iOS 关于对可变数组的修改发生崩溃问题

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"]];

你可能感兴趣的:(iOS 关于对可变数组的修改发生崩溃问题)