ARC项目中的NSTimer崩溃

时间:2013-07-21 10:47:22

标签: ios objective-c crash nstimer invalidation

我在MessagePlayerViewController(UIViewController)中有以下一对函数,它们移动一个滑块以反映AVAudioPlayer的播放进度:

-(void)startTrackingPlayback
{
    if(!self.isPlaying)
    {
        self.isPlaying = YES;
        self.playbackTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(updateProgress) userInfo:nil repeats:YES];
    }
}

-(void)stopTrackingPlayback
{
    if(self.playbackTimer)
    {
        if(self.playbackTimer.isValid)
        {
            [self.playbackTimer invalidate];
            self.playbackTimer = nil;
        }
    }
    self.isPlaying = NO;
}

间歇性地,并且没有可辨别的模式,我得到了Exec Bad Access堆栈中的前两项:

0 objc_msgSend
1 [MessagePlayerViewController stopTrackingPlayback];

这怎么可能?我在调用isValid之前检查计时器是否存在,并在我使其失效之前检查isValid

使用断点我可以看到计时器确实存在,但是当我将它设置为nil时会发生错误。如果我删除这一行,我在行上会得到一个相同的错误:

[self.playbackTimer invalidate];

1 个答案:

答案 0 :(得分:1)

我建议您检查使用MessagePlayerViewController的方式。在我看来,堆栈跟踪和您描述的行为都暗示了控制器比您的计时器更早被释放。

考虑到计划定时器的运行循环将使计时器保持活动这一事实。

也许修复就像在控制器的invalidate方法(或其它有意义的地方)中调用dealloc一样简单,但是如果你不提供更多的代码,就不可能说