Невозможно аннулировать (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
Здесь нет необходимости использовать эти строки.
Я надеюсь, что это сработает.