变异的方法发送给不可变的对象

当我第一次使用这个方法时,它工作正常,但是当我第二次调用它的时候,我得到错误“mutating method sent to immutable object”。 问题符合“addObject”命令。

-(IBAction) save: (id) sender{ NSMutableArray *placesT= [[NSUserDefaults standardUserDefaults] objectForKey:@"placesT"]; if (!placesT) { placesT=[[[NSMutableArray alloc] init] autorelease]; } [placesT addObject: [NSString stringWithFormat:@"%@", tagF.text] ]; NSUserDefaults *tUD=[NSUserDefaults standardUserDefaults]; [tUD setObject:placesT forKey:@"placesT"]; [tUD synchronize]; [self dismissModalViewControllerAnimated:YES]; 

}

正如NSUserDefaults的文档所述:“从NSUserDefaults返回的值是不可变的,即使您将可变对象设置为值。 每当你想改变你从NSUserDefaults得到的集合,你必须得到不可变的版本,做一个mutableCopy ,修改它,然后再把它设置回来。

这是因为存储在NSUserDefaults中的对象不是mutableArray而是普通数组。

 - (IBAction)save:(id)sender { NSMutableArray *placesT = nil; NSArray *tempArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"placesT"]; if (tempArray) { placesT = [tempArray mutableCopy]; } else { placesT = [[NSMutableArray alloc] init]; } [placesT addObject:[NSString stringWithFormat:@"%@", tagF.text]]; NSUserDefaults *tUD = [NSUserDefaults standardUserDefaults]; [tUD setObject:placesT forKey:@"placesT"]; [tUD synchronize]; [self dismissModalViewControllerAnimated:YES]; [placesT release]; } 

placesT是一个非可变数组,要么始终将placesT设置为可变对象,要么使用下面的代码。

 NSMutableArray *placesT= [[[NSUserDefaults standardUserDefaults] objectForKey:@"placesT"] mutableCopy]; 

这应该工作:

– (IBAction)保存:(id)发送者{

 NSMutableArray *placesT= [[NSMutableArray alloc]initWithArray:[[NSUserDefaults standardUserDefaults] 

objectForKey:@ “placesT”]];

 if (!placesT) { placesT=[[[NSMutableArray alloc] init] autorelease]; } [placesT addObject: [NSString stringWithFormat:@"%@", tagF.text] ]; NSUserDefaults *tUD=[NSUserDefaults standardUserDefaults]; [tUD setObject:placesT forKey:@"placesT"]; [tUD synchronize]; [self dismissModalViewControllerAnimated:YES]; }