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

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

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

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

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

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

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

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

}

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

Ответ 1

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

[sliderUpdateTimer invalidate];
sliderUpdateTimer=nil;

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

Ответ 2

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

- (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];
}

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

Ответ 3

Попробуйте удалить следующие строки из 1-го раздела вашего кода

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

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

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

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

Я надеюсь, что это сработает.