La colección <__ NSArrayM: 0x7fa1f2711910> fue mutada mientras se enumeraba

Hay un número de preguntas con título similar, pero ninguna de ellas me ayudó.

pero puedo relacionar la solución de esta 'NSGenericException', motivo: La colección <__ NSArrayM: 0x7fabb400> fue mutada mientras se enumeraba la pregunta con mi pregunta. Porque esta terminación está sucediendo cuando estoy agregando, eliminando el object de cadena con arreglo.

Error:

Terminando la aplicación debido a la exception no detectada 'NSGenericException', motivo: '*** Colección <__ NSArrayM: 0x7fa1f2711910> fue mutado mientras se enumeraba.'

Primera tirada de stack de llamadas:

( 0 CoreFoundation 0x00000001087b8c65 __exceptionPreprocess + 165 1 libobjc.A.dylib 0x0000000108422bb7 objc_exception_throw + 45 2 CoreFoundation 0x00000001087b85c4 __NSFastEnumerationMutationHandler + 132 3 0x0000000107e24cf5 -[ProfessionalRegSecond tableView:didDeselectRowAtIndexPath:] + 773 4 UIKit 0x0000000109759d71 -[UITableView _deselectRowAtIndexPath:animated:notifyDelegate:] + 347 5 UIKit 0x000000010974deea -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 187 6 UIKit 0x000000010968062c _applyBlockToCFArrayCopiedToStack + 314 7 UIKit 0x00000001096804a6 _afterCACommitHandler + 533 8 CoreFoundation 0x00000001086ebca7 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23 9 CoreFoundation 0x00000001086ebc00 __CFRunLoopDoObservers + 368 10 CoreFoundation 0x00000001086e1a33 __CFRunLoopRun + 1123 11 CoreFoundation 0x00000001086e1366 CFRunLoopRunSpecific + 470 12 GraphicsServices 0x000000010d6c8a3e GSEventRunModal + 161 13 UIKit 0x000000010965c900 UIApplicationMain + 1282 14 0x0000000107de14cf main + 111 15 libdyld.dylib 0x000000010b585145 start + 1 ) 

libc ++ abi.dylib: terminando con una exception no detectada de tipo NSException

Lo que trato de hacer:

Necesito una matriz de tal forma que cuando selecciono la celda quiero agregar ese object a la matriz y cuando estoy deseleccionando la fila, quiero eliminar esa fila de la matriz, de modo que la matriz de resultados solo será inputs seleccionadas. Como hacer esto ?

Aquí está mi código

 @implementation Professional { NSMutableArray *updatedLocalityArray; // alloc,init did in viewDidLoad NSString *toCheck; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:indexPath]; NSLog(@"%@",tableViewCell.textLabel.text); toCheck = tableViewCell.textLabel.text; [updatedLocalityArray addObject:toCheck]; NSLog(@"%@ *****", updatedLocalityArray); } - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:indexPath]; NSLog(@"%@",tableViewCell.textLabel.text); for (NSString *test in updatedLocalityArray) { if ([test isEqualToString:tableViewCell.textLabel.text]) { [updatedLocalityArray removeObject:test]; NSLog(@"%@ *****", updatedLocalityArray); } } } 

No puede eliminar elementos de un NSMutableArray mientras lo está iterando.

Hay varias soluciones a esto:

  • Itere una copy de la matriz

o

  • Use un bucle basado for índice for lugar de el for each syntax.

No copyr la matriz le ahorra una asignación y algunos ciclos de CPU:

 for (int i = updatedLocalityArray.count-1 ; i >= 0 ; i--) { NSString *test = updatedLocalityArray[i]; if ([test isEqualToString:tableViewCell.textLabel.text]) { [updatedLocalityArray removeObjectAtIndex:i]; NSLog(@"%@ *****", updatedLocalityArray); } } 

En el método deselect de tableview, escribiste:

 for (NSString *test in updatedLocalityArray) { if ([test isEqualToString:tableViewCell.textLabel.text]) { [updatedLocalityArray removeObject:test]; NSLog(@"%@ *****", updatedLocalityArray); } } 

En ese código, estás enumerando a través de updatedLocalityArray y si encuentras una coincidencia, estás eliminando ese object de la misma matriz, esta lógica está causando el problema aquí. Para solucionar esto, debe crear una copy local y hacer los cambios y volver a asignarla al arreglo original después de la enumeración.

 NSMutableArray *tempArray = [updatedLocalityArray mutableCopy]; for (NSString *test in updatedLocalityArray) { if ([test isEqualToString:tableViewCell.textLabel.text]) { [tempArray removeObject:test]; NSLog(@"%@ *****", tempArray); } } updatedLocalityArray = tempArray; 

si su matriz actual es A, puede copyr otra matriz similar llamada B, luego puede enumerar B y operar A, entonces no se bloqueará.

Si su matriz actual es A , puede copyr otra matriz similar llamada B , luego puede enumerar B y operar A , luego no se bloqueará.

No puede modificar contenedores al enumerarlos.

 NSMutableArray *tempArray = someArray.mutableCopy; 

No puede modificar la matriz mientras realiza un bucle con la instrucción for...in... control.

Tratar:

  NSArray *compareArray = [updatedLocalityArray copy]; for (NSString *test in compareArray) // ...