Error de iOS ": método de mutación enviado a object inmutable"

El error:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray removeObjectAtIndex:]: mutating method sent to immutable object' 

El código:

.h

 @property (nonatomic, strong) NSMutableArray *history; 

.m

 - (void)tableView:(UITableView *)tableView commitEditingStyle: (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { NSString *de = [[self.history objectAtIndex:indexPath.row] objectForKey:@"des"]; NSString *dest = [de stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *jsonURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://example.com/rm_history.php?user_id=%@&destinations=%@",self.uID,dest]]; NSData *jsonData = [NSData dataWithContentsOfURL:jsonURL]; [self.history removeObjectAtIndex:indexPath.row]; [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade]; } else if (editingStyle == UITableViewCellEditingStyleInsert) { NSLog(@"create"); // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view } [self.tableView reloadData]; } 

Después de establecer un punto de interrupción para detectar el error, se detiene en esta línea:

 [self.history removeObjectAtIndex:indexPath.row]; 

¿Alguna idea sobre qué está causando el problema?

El hecho de que declare el history como NSMutableArray no significa que solo se pueda asignar NSMutableArray . Es posible asignar un NSArray inmutable al history si no tiene cuidado. Por ejemplo, esto es lo que sucederá si serializa NSMutableArray , por ejemplo, a JSON, y luego lo deserializa de nuevo a NSMutableArray : obtendrá un NSArray lugar.

Para evitar este problema, asegúrese de asignar siempre un history NSMutableArray que cree o el resultado de llamar a un mutableCopy en un NSArray que reciba de otras partes de su código:

 self.history = [[dataDictionary objectForKey:@"ds_history"] mutableCopy]; 

Te enfrentas a este problema porque NSUserDefaults siempre devuelve un object inmutable.

Por favor, al recuperar el object mutable de NSUserDefaults, consulte el código siguiente.

 NSMutableArray *storeArray = [[defaultDefects objectForKey:@"defaultStoreDefects"] mutableCopy]; 

* NSUserDefaults siempre devuelve un object inmutable *

 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; NSMutableArray *history; 

-> para save o almacenar

 [userDefaults setObject:histrory forKey:@"des"]; [userDefaults synchronize]; 

-> para recuperar

 history = [[userDefaults objectForKey:@"des"] mutableCopy]; 

Creo que self.history fue self.history a NSArray cuando fue asignado.

Pruebe el código a continuación:

 self.history = [NSMutableArray arrayWithArray:[dataDictionary objectForKey:@"ds_history"]];