iPhone 4 iOS5 Как правильно отменить несколько NSTimers одновременно с ARC?

У меня есть несколько таймеров, запланированных для воспроизведения музыки через определенные промежутки времени. Я пытаюсь выяснить, правильно ли я их отменяю, так как мой код не работает из-за нижеприведенного исключения.

Я пытаюсь добавить все таймеры в NSMutableArray, а затем просто аннулировать каждый из них, чтобы они не срабатывали так:

  [playTimers addObject:[NSTimer scheduledTimerWithTimeInterval:reminderDelay target:self selector:@selector(appMusicPlayerPlay:) userInfo:nil repeats:NO]];

Я ожидаю, что метод stop пройдет через массив и сделает недействительными таймеры. Должен ли я вызывать removeObject по таймеру или проще перераспределить массив с помощью ARC?

[Обновлено: вот исправленное решение для отмены всех таймеров одновременно]

-(int)stop
{
    [musicPlayer pause];
    [self pause];
    @try {
        for(NSTimer* timer in playTimers)
        {
            [timer invalidate];
        }
    }
    @catch (NSException *exception) {
        NSLog(@"exception: %@",[exception description]);
    }
    @finally {
        [playTimers removeAllObjects]

    }

    state = kRemoteControlStateStopped;
    return  state;
}

Вот исключение, которое я поймал после попытки удалить объект из NSMutableArray во время итерации по массиву:

*** Collection <__NSArrayM: 0x5429330> was mutated while being enumerated.

1 ответ

Решение

Вы не должны изменять содержимое массива при использовании цикла для перебора элементов. Вы всегда можете просто аннулировать все таймеры и позвонить removeAllObjects на массиве после этого.

Другие вопросы по тегам