2012-03-22 69 views
0

我正在使用MPMoviePlayerViewController在iOS中播放視頻。當視頻停止或崩潰時,我想關閉此視圖控制器並將其釋放。爲了模擬崩潰,我已經通過了一個不存在的文件路徑:如何在播放完成後釋放MPMoviePlayerViewController?

MPMoviePlayerViewController* p = [ 
    [MPMoviePlayerViewController alloc] init 
]; 
self.player = p; 
[p release]; 
[[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(moviePlayBackDidFinish:) 
    name:MPMoviePlayerPlaybackDidFinishNotification 
    object:self.player.moviePlayer 
]; 
self.player.moviePlayer.contentURL = @"purposelyFake.mp4"; 

這將立即觸發下面的回調。

- (void) moviePlayBackDidFinish 
{ 
    if (self.player != nil) { 
     [self.player.moviePlayer stop]; 
     self.player = nil 
    } 
} 

self.player是一個非原子保留的性質,因此它設置爲nil應該釋放它。這將清除內存,但我的日誌顯示這樣的警告:

類AVPlayerItem被釋放,而關鍵 值觀察家仍用它註冊一個實例0x127b20。觀察信息是 泄漏,甚至可能被誤認爲是其他物體。 在NSKVODeallocateBreak上設置斷點,在調試器中停止。

原因是因爲moviePlayBackDidFinish在視頻崩潰時被調用兩次。一次說MPMovieFinishReasonPlaybackEnded,再說MPMovieFinishReasonPlaybackError。當第二個通知仍在發送時,MPMoviePlayerViewController變爲釋放狀態。我的問題是:我如何擺脫這個警告?請記住,在正常播放完成時,只發布MPMovieFinishReasonPlaybackEnded,因此無論何時只要我連續收到兩個通知,我都無法將其硬編碼爲只發布。

回答

0

在您的回調方法中,嘗試在釋放之前嘗試刪除自己作爲通知的觀察者。

[[NSNotificationCenter defaultCenter] removeObserver: self name: MPMoviePlayerPlaybackDidFinishNotification object: myMPMoviePlayerController]; 
+0

試過了,我仍然得到相同的警告。 – JoJo 2012-03-22 21:34:24

相關問題