无法失效(停止)NSTimer

可能重复:
NSTimer不停止

我正在使用NSTimer更新播放audio时滑块的值。

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

一旦audio完成播放我无效的audio播放器委托方法中的计时器。

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

}

委托方法正在调用,但计时器不停止….我只有一个线程上运行计时器。 但是,定时器仍然不会停止….在这方面的任何帮助是值得欢迎的…

首先,你会放弃它,并应该得到EXC_BADACCESS(你没有保留计时器,当你设置它,所以你不应该释放它)。 只应该打电话:

 [sliderUpdateTimer invalidate]; sliderUpdateTimer=nil; 

由于你没有收到崩溃,看起来sliderUpdateTimer在调用audioPlayerDidFinishPlaying:nil 。 用户NSLog或放置一个断点来检查这是否为真。 如果是这样的话,你可能slideUpdateTimer它设置为零,searchslideUpdateTimer并检查可能发生的位置。

嘿,试试这件事…

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

我知道你只有单线程,但可能有两个不同的运行循环

从代码的第一部分删除下面的行后尝试

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

不需要在该sliderUpdateTimer对象上调用释放消息

因为您已经创build了具有挂起的autorelease消息的对象

这里不需要使用这些线。

我希望这会起作用。