可能重复:
NSTimer doesn't stop
我正在使用NSTimer在播放音频时更新滑块的值。
if (sliderUpdateTimer) {
[sliderUpdateTimer invalidate];
sliderUpdateTimer=nil;
}
sliderUpdateTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateSliderForAudio) userInfo:nil repeats:YES];
音频播放结束后,我在audioPlayer委托方法中使Timer无效。
-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
NSLog(@"audioPlayerDidFinishPlaying");
[player release];
audioPlayer=nil;
[sliderUpdateTimer invalidate];
[sliderUpdateTimer release];
sliderUpdateTimer=nil;
}
委托方法被调用,但计时器没有停止....我只有一次线程,我正在运行计时器。但是计时器仍然没有停止......欢迎任何这方面的帮助......
答案 0 :(得分:6)
首先,你将过度释放它并且应该接收EXC_BADACCESS(你在设置时没有保留定时器,因此你也不应该释放它)。应该只打电话:
[sliderUpdateTimer invalidate];
sliderUpdateTimer=nil;
由于您没有收到崩溃,因此调用sliderUpdateTimer
时nil
audioPlayerDidFinishPlaying:
似乎为slideUpdateTimer
。用户NSLog或放置一个断点来检查是否为真。如果是这种情况,您可能会在某个时刻将其设置为nil,搜索{{1}}并检查可能发生的位置。
答案 1 :(得分:4)
嘿试试这个......
- (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];
}
我知道你只有单线程,但可能有两个不同的运行循环
答案 2 :(得分:3)
从代码的第1部分删除以下行后尝试
if (sliderUpdateTimer){
[sliderUpdateTimer invalidate];
sliderUpdateTimer=nil;
}
不需要在该sliderUpdateTimer对象上调用release消息
因为您已使用待处理的自动释放消息创建该对象
这里不需要使用这些行。
我希望这会奏效。