Невозможно аннулировать (остановить) NSTimer

Возможный дубликат:
NSTimer не останавливается

Я использую NSTimer для обновления значения ползунка во время воспроизведения звука.

 if (sliderUpdateTimer) {
    [sliderUpdateTimer invalidate];
    sliderUpdateTimer=nil;
}

sliderUpdateTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateSliderForAudio) userInfo:nil repeats:YES];

после завершения воспроизведения звука я аннулирую метод делегата Timer в audioPlayer.

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
NSLog(@"audioPlayerDidFinishPlaying");
[player release];
audioPlayer=nil;

[sliderUpdateTimer invalidate];
[sliderUpdateTimer release];
sliderUpdateTimer=nil;

}

Метод делегата вызывается, но таймер не останавливается... У меня есть только один поток, на котором я запускаю таймер. Но все же таймер не останавливается... Любая помощь в этом отношении приветствуется...


person A for Alpha    schedule 02.02.2012    source источник
comment
Это правильный способ остановки таймера, должно быть что-то еще не так. Что вы видите? Функция updateSliderForAudio все еще вызывается? Как вы можете сказать? Приложение вылетает?   -  person Thomas Clayson    schedule 02.02.2012
comment
какой метод содержит код if (sliderUpdateTimer) { ...???   -  person Inder Kumar Rathore    schedule 02.02.2012
comment
Приложение не вылетает. Но updateSliderForAudio вызывается непрерывно даже после того, как таймер признан недействительным.... Операторы журнала в методе вызываются даже после признания метода недействительным   -  person A for Alpha    schedule 02.02.2012


Ответы (3)


Прежде всего, вы перестанете выпускать его и должны получить EXC_BADACCESS (вы не сохраняете таймер, когда устанавливаете его, поэтому вы также не должны его выпускать). Должен вызывать только:

[sliderUpdateTimer invalidate];
sliderUpdateTimer=nil;

Поскольку вы не получаете сбой, кажется, что sliderUpdateTimer является nil при вызове audioPlayerDidFinishPlaying:. Пользователь NSLog или поставить точку останова, чтобы проверить, так ли это. Если это так, вы, вероятно, в какой-то момент установили его на ноль, найдите slideUpdateTimer и проверьте, где это может произойти.

person alex-i    schedule 02.02.2012

Эй, попробуй эту штуку...

- (void)stopTimer{
    [sliderUpdateTimer invalidate];
    //don't release it. as it is autoreleased.
    //[sliderUpdateTimer release];
    sliderUpdateTimer=nil;
}


-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
    NSLog(@"audioPlayerDidFinishPlaying");
    [player release];
    audioPlayer=nil;
    [self performSelectorOnMainThread:@selector(stopTimer) withObject:nil waitUntilDone:NO];
}

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

person Inder Kumar Rathore    schedule 02.02.2012

Попробуйте после удаления следующих строк из 1-го раздела кода

if (sliderUpdateTimer){
    [sliderUpdateTimer invalidate];
    sliderUpdateTimer=nil;
}

Не нужно вызывать сообщение о выпуске для этого объекта sliderUpdateTimer

Поскольку вы создали этот объект с ожидающим сообщением об автоматическом освобождении

Здесь нет необходимости использовать эти строки.

Надеюсь, это сработает.

person Kamar Shad    schedule 02.02.2012