我有 NSMutableArrays
的 NSMutableArrays
:
NSMutableArray *array = [[NSMutableArray alloc]init];
for (int i = 0; i < 5; i++)
{
NSMutableArray *miniArray = [[NSMutableArray alloc]init];
for (int k = 0; k < 30; k++)
{
[miniArray addObject:@"0"];
}
[array addObject:miniArray];
}
然后,当我尝试这样做时:
[[array objectAtIndex:packIndex]replaceObjectAtIndex:index withObject:@"1"];
它崩溃了:[__NSCFArray replaceObjectAtIndex:withObject:]: mutating method sent to immutable object'
为什么?怎么修 ?谢谢!
更新:
我将这个数组保存在 NSUserDefaults
中:
[defaults setObject:array forKey:@"mainArray"];
然后,我在另一个类上看了:
array = [[NSMutableArray alloc]initWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"mainArray"]];
另外,我必须提一下,有时代码运行良好,它会将“0”更改为“1”。但它有时也会崩溃。所以我看不到逻辑,为什么它工作正常或者为什么有时会崩溃。
最佳答案
问题是当你从 NSUserDefaults 中读取数组时,迷你数组不会自动成为 NSMutableArrays。
试试这个:
array = [[NSMutableArray alloc]initWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"mainArray"]];
for(int i = 0; i < array.count; i++) {
NSArray * tempArray = array[i];
array[i] = [tempArray mutableCopy];
}
编辑: Best Coder 的回答解释了为什么会这样。 存储在 NSUserDefaults 中的对象存储为不可变版本,基本上 NSUserDefaults 是一个 plist 并且没有标志将数组标记为可变/不可变,因此当您读回它们时,它们被假定为不可变。
关于iphone - NSMutableArrays 的 NSMutableArray。发送到不可变对象(immutable对象)的变异方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14840437/