无法使(停止)NSTimer无效

时间:2012-02-02 09:04:30

标签: iphone ios nstimer

  

可能重复:
  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;

}

委托方法被调用,但计时器没有停止....我只有一次线程,我正在运行计时器。但是计时器仍然没有停止......欢迎任何这方面的帮助......

3 个答案:

答案 0 :(得分:6)

首先,你将过度释放它并且应该接收EXC_BADACCESS(你在设置时没有保留定时器,因此你也不应该释放它)。应该只打电话:

[sliderUpdateTimer invalidate];
sliderUpdateTimer=nil;

由于您没有收到崩溃,因此调用sliderUpdateTimernil 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消息

因为您已使用待处理的自动释放消息创建该对象

这里不需要使用这些行。

我希望这会奏效。