2013-07-21 32 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