获取"变异方法发送到不可变对象"错误

And*_*rew 1 iphone objective-c nsmutablearray

我无法弄清楚造成这种情况的原因.基本上,一些不同的"任务"在我的应用程序中相互冲突.当我按下按钮时,它运行此代码就好了:

PalAppDelegate *dataCenter = (PalAppDelegate *)[[UIApplication sharedApplication] delegate];




[dataCenter.colourPalettesContainer addObject:[NSNumber numberWithInt:5]];
Run Code Online (Sandbox Code Playgroud)

它可以像我喜欢的那样多次这样做.但是,当我执行另一项任务(以及导致这种情况发生的一些任务)时,这涉及此代码:

PalAppDelegate *dataCenter = (PalAppDelegate *)[[UIApplication sharedApplication] delegate];

[dataCenter.colourPalettesContainer removeObjectAtIndex:touchDownID];

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject:dataCenter.colourPalettesContainer forKey:@"container"];
[prefs synchronize];
Run Code Online (Sandbox Code Playgroud)

然后:

dataCenter.colourPalettesContainer = [prefs objectForKey:@"container"];
Run Code Online (Sandbox Code Playgroud)

当我在此之后再次运行第一个代码时,它会导致"发送到不可变对象的变异方法"错误.我怎么能阻止这个?

编辑:所以我从下面的一些答案中找到了问题.有没有人有不同的做法,他们建议?

McC*_*nus 6

NSUserDefaults返回一个不可变数组.当你加载它时,你需要制作一个可变的副本:

NSMutableArray *mutableArray = [[prefs objectForKey:@"container"] mutableCopy];
dataCenter.colourPalettesContainer = mutableArray;
[mutableArray release];
Run Code Online (Sandbox Code Playgroud)

您可能还需要在数组内部进行一些操作,因为您在其中存储了NSMutableArrays.