NSMutableArray的NSMutableArray。变异的方法发送到不可变对象

问题描述:

我有NSMutableArraysNSMutableArrayNSMutableArray的NSMutableArray。变异的方法发送到不可变对象

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

然后,当我尝试这样做:[__NSCFArray replaceObjectAtIndex:withObject:]: mutating method sent to immutable object'

为什么:

[[array objectAtIndex:packIndex]replaceObjectAtIndex:index withObject:@"1"]; 

它崩溃?怎么修 ?谢谢 !

UPD: 我保存NSUserDefaults此阵:

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

然后,我在其他类阅读:

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

而且,我必须一提的是,有时代码运行良好并将“0”更改为“1”。但它也有时会崩溃。所以我不能看到逻辑,为什么它可以正常工作,或者为什么它有时会崩溃。

+1

什么是boolArray?你的意思是miniArray? – rdelmar 2013-02-12 19:42:13

+0

@rdelmar是的,对不起。我现在就修复它。 – SmartTree 2013-02-12 19:42:46

+0

这是你的问题中的错字,还是你的代码中有这个错字? – rdelmar 2013-02-12 19:43:51

的问题是,当你读出数组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]; 
} 

编辑: 最佳编码器的回答解释这是为什么。 存储在NSUserDefaults中的对象被存储为不可变的版本,基本上NSUserDefaults是一个plist,并且没有标记将数组标记为可变/不可变的标记,所以当你读出它们时,它们被认为是不可变的。

+1

我试过了......它的功能非常棒!谢谢。你能解释一下,为什么微型数组不是自动的NSMutaleArrays,如果它们原来是这样的话? – SmartTree 2013-02-12 20:16:28

+0

@SmartTree从'NSUserDefaults'中读取的所有数据都以不可变的形式返回。从'NSUserDefaults'中读取时,即使主数组也是不可变的。 – rmaddy 2013-02-12 20:20:35

+0

没问题!看我的编辑。 – Lance 2013-02-12 20:20:46

尝试使用更冗长的代码:

NSMutableArray *tempArray = [array objectAtIndex:packIndex]; 
[tempArray replaceObjectAtIndex:index withObject:@"1"]; 
+0

你能解释为什么你认为这会有帮助吗?这两个是相同的。 – 2013-02-12 20:08:27

+0

由于某些原因,迷你阵列不能作为可变阵列存储。这会迫使他们变​​得可变。 – 2013-02-12 20:11:17

+3

这不会强迫他们变化。您可能已经使用了将一种类型的对象分配给另一种类型的变量的语言来投射对象。它在Objective-C中不起作用。所有的对象变量都是指针,将一个类型的指针赋值给另一个类型的指针变量不会改变底层的数据 - 它只是让编译器知道变量指向什么。对象类型仅用于静态类型检查,并确保属性使用正确的访问器。 – Chuck 2013-02-12 20:31:58

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

相反,让你从检索NSUserDefaults的阵列中的mutableCopy,添加的对象,然后设置新的数组回到

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

+0

感谢您的解释!现在清楚了。 – SmartTree 2013-02-12 20:21:16