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