Odpowiedz

12

Nie, otrzymasz błąd, jeśli zmutujesz tablicę podczas szybkiego wyliczania pętli. Utwórz kopię tablicy, powtórz ją i usuń z oryginału.

NSArray *itemsCopy = [items copy]; 

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

[itemsCopy release]; 
+0

nie byłoby to pominąć 1 elementu ponieważ każdy element tablicy zostanie przesunięty o 1, gdy delecja dzieje. –

+0

Nie, nie usuwamy elementu z ekranu za pomocą indeksu z tym przykładem. Metoda removeObject: NSMutableArray: przegląda tablicę i usuwa pierwsze odwołanie do znalezionego obiektu. Wewnętrznie wywołanie używa indexOfObject: i removeObjectAtIndex: aby to zrobić. Może to być hitem wydajności, jeśli masz wystarczająco dużą tablicę. Możesz nieco ją zoptymalizować, śledząc indeks, ale musisz go skorygować w celu usunięcia. – McCygnus

3

Nope:

Wyliczenie jest „bezpieczny” -the wyliczający ma straż mutacji, tak że w przypadku próby modyfikacji kolekcji podczas wyliczania wyjątek jest podniesiona.

Opcje zmieniając tablicę, który chcesz wyliczyć poprzez podano w Using Enumerators: albo skopiować tablicę i wyliczyć poprzez, lub budowania zestawu do indeksu, który służy po pętli.

+0

dzięki - sugestia McCygnusa zdaje się przylegać do tego, więc wygląda na ok. – Greg

0

można usunąć tak:

//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

To sprawia, że ​​różnica. ;) – user3761851