iPhone 4 iOS5 Как правильно отменить несколько NSTimers одновременно с ARC? - PullRequest
0 голосов
/ 14 ноября 2011

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

Я пытаюсь добавить все таймеры в 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 Ответ

3 голосов
/ 14 ноября 2011

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

...