2013-07-21 33 views
0

我有以下在MessagePlayerViewController(UIViewController中)对功能,这移动的滑块,以反映一个AVAudioPlayer的播放进度:的NSTimer崩溃在ARC项目

-(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 ith顶部两项中的堆栈为:

0 objc_msgSend 
1 [MessagePlayerViewController stopTrackingPlayback]; 

这是怎么回事?在我致电isValid之前,我检查计时器是否存在,并在我使其无效之前检查isValid

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

[self.playbackTimer invalidate]; 
+1

你在updateProgress中做了什么?你可以表演吗? – stosha

+0

请添加您使用过的所有方法。 – Nirav

+0

尝试使用'... repeats:NO'并在处理程序中再次设置 –

回答

1

我会建议检查您使用MessagePlayerViewController的方式。在我看来,堆栈跟踪和你描述的行为都暗示它是控制器早于你的定时器被释放的事实。

考虑到定时器调度的运行循环会使定时器保持活动的事实。

也许修复很简单,只需在控制器的dealloc方法(或其他有意义的地方)调用invalidate即可,但如果不提供更多代码,则无法说明。

+0

你对这笔钱感到兴奋。这正是问题所在。我没有看到树木的木材。 – Undistraction