mutating方法发送到不可变对象

gba*_*aor 13 cocoa cocoa-touch objective-c ios

当我第一次使用这个方法它工作正常,但当我第二次调用它时,我得到错误"变异方法发送到不可变对象".问题与"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];
Run Code Online (Sandbox Code Playgroud)

}

smo*_*gan 24

正如NSUserDefaults的文档所说:"即使您将可变对象设置为值,NSUserDefaults返回的值也是不可变的." 每当您想要更改从NSUserDefaults获得的集合时,您必须获取不可变版本,进行mutableCopy修改,然后再将其重新设置.

  • 添加到这个例子:someMutableArray = [yourArrayFromDictionary mutableCopy]; 希望有帮助:) (2认同)

rck*_*nes 10

这是因为存储在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];
}
Run Code Online (Sandbox Code Playgroud)