Agregar nuevo object a NSMutableArray recuperado: devuelve NSInternalInconsistencyException

Sigo recibiendo este error cuando bash agregar un object a un NSMutableArray recuperado.

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

Recuperar:

 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; NSMutableArray *arrayOfTitles = [userDefaults objectForKey:@"mainArraySaveData"]; NSMutableArray *arrayOfSubjects = [userDefaults objectForKey:@"subjectArraySaveData"]; NSMutableArray *arrayOfDates = [userDefaults objectForKey:@"dateArraySaveData"]; _mutableArray=arrayOfTitles; _subjectArray=arrayOfSubjects; _dateArray=arrayOfDates; [_tableView reloadData]; 

Salvar:

 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; _mutableArray = [[NSMutableArray alloc] initWithArray:[userDefaults objectForKey:@"mainArraySaveData"]]; [userDefaults setObject:_mutableArray forKey:@"mainArraySaveData"]; [userDefaults synchronize]; _dateArray = [[NSMutableArray alloc] initWithArray: [userDefaults objectForKey:@"dateArraySaveData"]]; [userDefaults setObject:_dateArray forKey:@"dateArraySaveData"]; [userDefaults synchronize]; _subjectArray = [[NSMutableArray alloc] initWithArray: [userDefaults objectForKey:@"subjectArraySaveData"]]; [userDefaults setObject:_subjectArray forKey:@"subjectArraySaveData"]; [userDefaults synchronize]; 

Estoy confundido ya que pensé que esto estaba diseñado para devolver un NSMutableArray , pero dice que no: NSArray . ¿Cuál es mi problema? Gracias Seboh

Estoy confundido ya que pensé que esto estaba diseñado para devolver un NSMutableArray , pero dice que no: NSArray . ¿Cuál es mi problema?

La documentation de NSUserDefaults habla específicamente sobre este problema en la sección "consideraciones especiales" del método objectForKey: :

Consideraciones Especiales

El object devuelto es inmutable, incluso si el valor que configuró originalmente era mutable.

La solución de este problema es fácil: use mutableCopy: initWithArray: o arrayWithArray: método para hacer copys mutables:

 _mutableArray=[arrayOfTitles mutableCopy]; // You can do this... _subjectArray=[NSMutableArray arrayWithArray:arrayOfSubjects]; // ...or this _dateArray=[[NSMutableArray alloc] initWithArray:arrayOfDates]; // ...or this. 

Los valores por defecto del usuario devuelven objects inmutables por lo que debe llamar a mutableCopy en cada uno antes de poder modificarlos.

Cuando define una variable como NSMutableArray * , es su responsabilidad asegurarse de que la instancia que almacena allí sea del tipo correcto. El comstackdor solo le dirá que está equivocado si lo puede decir. En este caso, el método devuelve id ya que está solicitando 'cualquier tipo de object existente para esta key' de los valores pnetworkingeterminados del usuario.