Мутирующий метод, отправленный на неизменяемый объект

Когда я впервые использую этот метод, он работает нормально, но когда я его вызывал второй раз, я получаю ошибку "метод мутирования, отправленный в неизменяемый объект". Проблема заключается в команде "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];

}

Ответы

Ответ 1

В документации для NSUserDefaults говорится: "Значения, возвращаемые из NSUserDefaults, неизменяемы, даже если вы устанавливаете изменяемый объект как значение". Всякий раз, когда вы хотите изменить коллекцию, которую вы получаете из NSUserDefaults, вам нужно получить неизменяемую версию, сделать mutableCopy, изменить ее и снова установить.

Ответ 2

Это потому, что объект, хранящийся в 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];
}

Ответ 3

placesT - не изменяемый массив, либо всегда устанавливайте placesT изменяемый объект всегда, либо используйте следующий код.

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

Ответ 4

Это должно работать:

- (IBAction) save: (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]; }