【问题标题】:Unable to invalidate (Stop) NSTimer [duplicate]无法使(停止)NSTimer [重复]
【发布时间】:2012-02-02 09:04:30
【问题描述】:

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

}

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

【问题讨论】:

  • 这才是停止定时器的正确方法,肯定有其他问题。你在看什么?函数updateSliderForAudio 还在被调用吗?你怎么知道?应用程序崩溃了吗?
  • 哪个方法包含if (sliderUpdateTimer) { ...代码???
  • 应用程序没有崩溃。但是,即使在计时器失效后,updateSliderForAudio 也会被连续调用......即使在方法失效后,方法中的日志语句也会被调用

标签: iphone ios nstimer


【解决方案1】:

首先,您将过度释放它并且应该收到 EXC_BADACCESS(设置它时您没有保留计时器,因此您也不应该释放它)。应该只调用:

[sliderUpdateTimer invalidate];
sliderUpdateTimer=nil;

由于您没有收到崩溃,因此在调用 audioPlayerDidFinishPlaying: 时,sliderUpdateTimer 似乎是 nil。用户 NSLog 或放置断点以检查是否为真。如果是这种情况,您可能在某个时候将其设置为 nil,搜索 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】:

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

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

      不需要在该 sliderUpdateTimer 对象上调用发布消息

      因为您已经创建了带有待处理自动释放消息的对象

      这里不需要使用这些行。

      我希望这会奏效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-30
        • 1970-01-01
        相关资源
        最近更新 更多