我在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];
答案 0 :(得分:1)
我建议您检查使用MessagePlayerViewController
的方式。在我看来,堆栈跟踪和您描述的行为都暗示了控制器比您的计时器更早被释放。
考虑到计划定时器的运行循环将使计时器保持活动这一事实。
也许修复就像在控制器的invalidate
方法(或其它有意义的地方)中调用dealloc
一样简单,但是如果你不提供更多的代码,就不可能说