Удалить элементы в цикле без побочных эффектов? - PullRequest
5 голосов
/ 29 апреля 2011

Могу ли я удалить элементы, которые я зацикливаю, в цикле Objective-C for без побочных эффектов?

Например, это нормально?

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

Ответы [ 3 ]

12 голосов
/ 29 апреля 2011

Нет, вы получите ошибку, если вы измените массив во время быстрого перечисления для цикла. Сделайте копию массива, переберите его и удалите из оригинала.

NSArray *itemsCopy = [items copy];

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

[itemsCopy release];
3 голосов
/ 29 апреля 2011

Нет:

Перечисление «безопасно» - перечислитель имеет защиту от мутаций, поэтому при попытке изменить коллекцию во время перечисления возникает исключение.

Параметры для изменения массива, через который вы хотите перечислить, приведены в Использование перечислителей : либо скопируйте массив и выполните перечисление, либо создайте набор индексов, который вы используете послецикл.

0 голосов
/ 15 мая 2015

вы можете удалить так:

    //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];
        }
    }
...