0

我在 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];
4

1 回答 1

1

我建议检查您使用MessagePlayerViewController. 在我看来,堆栈跟踪和您描述的行为都暗示了控制器在您的计时器之前被释放的事实。

考虑到调度计时器的运行循环将使计时器保持活动状态这一事实。

也许修复就像调用invalidate控制器的dealloc方法(或其他有意义的地方)一样简单,但如果您不提供更多代码,则无法说。

于 2013-07-21T13:47:59.960 回答