7

NSMutableArrayNSMutableArrays

 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'

为什么 ?怎么修 ?谢谢 !

UPD:我将此数组保存在NSUserDefaults

[defaults setObject:array forKey:@"mainArray"];

然后,我在另一堂课上读到它:

array = [[NSMutableArray alloc]initWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"mainArray"]];

另外,我必须提到,有时代码运行良好,它会将“0”更改为“1”。但它有时也会崩溃。所以我看不到逻辑,为什么它工作正常或为什么有时会崩溃。

4

3 回答 3

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

编辑:Best Coder 的回答解释了为什么会这样。存储在 NSUserDefaults 中的对象存储为不可变版本,基本上 NSUserDefaults 是一个 plist,并且没有将数组标记为可变/不可变的标志,因此当您将它们读回时,它们被假定为不可变的。

于 2013-02-12T20:09:45.763 回答
6

从 NSUserDefaults 返回的值是不可变的,即使您将可变对象设置为值。例如,如果您将可变字符串设置为“MyStringDefault”的值,那么您稍后使用 stringForKey: 检索的字符串将是不可变的。

相反,对您从 NSUserDefaults 检索到的数组创建一个 mutableCopy,添加您的对象,然后重新设置您的新数组。

看到这个链接:http: //developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html

于 2013-02-12T20:11:31.720 回答
-5

尝试使用更详细的代码:

NSMutableArray *tempArray = [array objectAtIndex:packIndex];
[tempArray replaceObjectAtIndex:index withObject:@"1"];
于 2013-02-12T19:57:33.243 回答