Sma*_*ree 7 iphone xcode cocoa objective-c ios
我NSMutableArray的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];
}
Run Code Online (Sandbox Code Playgroud)
然后,当我尝试这样做时:
[[array objectAtIndex:packIndex]replaceObjectAtIndex:index withObject:@"1"];
Run Code Online (Sandbox Code Playgroud)
它崩溃了: [__NSCFArray replaceObjectAtIndex:withObject:]: mutating method sent to immutable object'
为什么?怎么修 ?谢谢 !
UPD:我把这个数组保存在NSUserDefaults:
[defaults setObject:array forKey:@"mainArray"];
Run Code Online (Sandbox Code Playgroud)
然后,我在其他课程中阅读:
array = [[NSMutableArray alloc]initWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"mainArray"]];
Run Code Online (Sandbox Code Playgroud)
此外,我必须提到,有时代码运行良好,它将"0"更改为"1".但它有时也崩溃了.所以我无法看到逻辑,为什么它工作正常或为什么它有时会崩溃.
Lan*_*nce 26
问题是,当您从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];
}
Run Code Online (Sandbox Code Playgroud)
编辑:最佳编码器的答案解释了为什么会这样.存储在NSUserDefaults中的对象存储为不可变版本,基本上NSUserDefaults是一个plist,并且没有标记数组为可变/不可变的标志,因此当您将它们读回时,它们被假定为不可变的.
即使您将可变对象设置为值,NSUserDefaults返回的值也是不可变的.例如,如果将可变字符串设置为"MyStringDefault"的值,则稍后使用stringForKey:检索的字符串将是不可变的.
而是,创建从NSUserDefaults检索的数组的mutableCopy,添加您的对象,然后重新设置您的新数组.
请参阅此链接:http: //developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html
| 归档时间: |
|
| 查看次数: |
7047 次 |
| 最近记录: |