метод мутации отправлен на неизменный объект - PullRequest
13 голосов
/ 26 апреля 2011

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

}

Ответы [ 4 ]

24 голосов
/ 26 апреля 2011

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

10 голосов
/ 26 апреля 2011

Это потому, что объект, хранящийся в 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 голосов
/ 18 апреля 2013

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

NSMutableArray *placesT= [[[NSUserDefaults standardUserDefaults] objectForKey:@"placesT"] mutableCopy];
0 голосов
/ 18 ноября 2014

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

- (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]; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...