Respuesta

12

No, obtendrá un error si cambia la matriz en una enumeración rápida para el ciclo. Haga una copia de la matriz, repita y elimine de su original.

NSArray *itemsCopy = [items copy]; 

for (id item in itemsCopy) { 
    if ([item customCheck]) 
     [items removeObject:item]; // Is this ok here 
} 

[itemsCopy release]; 
+0

No sería esto saltar 1 elemento, ya que cada elemento de la matriz se desplaza 1 cuando ocurre eliminación. –

+0

No, no eliminaremos el elemento de la pantalla con un índice con este ejemplo. El método removeObject de NSMutableArray examina el conjunto y elimina la primera referencia al objeto que encuentra. Internamente, la llamada usa indexOfObject: y removeObjectAtIndex: para hacerlo. Esto podría ser un golpe de rendimiento si tienes una matriz lo suficientemente grande. Podrías optimizarlo un poco siguiendo el índice, pero luego tendrías que ajustarlo para eliminarlo. – McCygnus

3

Nope:

enumeración es “seguro”, el encuestador tiene un guardia de la mutación de manera que si se intenta modificar la colección durante la enumeración, se produce una excepción.

opciones para cambiar una matriz que desea enumerar se dan en Using Enumerators: o bien copiar la matriz y enumerar, o construir un conjunto de índices que se utiliza después del bucle.

+0

gracias - la sugerencia de McCygnus parece adherirse a esto por lo que se ve bien – Greg

0

puede eliminar de esta manera:

//Create array 
    NSMutableArray* myArray = [[NSMutableArray alloc] init]; 

    //Add some elements 
    for (int i = 0; i < 10; i++) { 
     [myArray addObject:[NSString stringWithFormat:@"i = %i", i]]; 
    } 

    //Remove some elements =} 
    for (int i = (int)myArray.count - 1; i >= 0 ; i--) { 
     if(YES){ 
      [myArray removeObjectAtIndex:i]; 
     } 
    } 
+0

Que yo-- hace la diferencia. ;) – user3761851

Cuestiones relacionadas