2011-11-07 51 views
6

當我嘗試從我的iPhone上播放的視頻(位於documentsDirectory),我得到使用的是iOS 5,而這是工作的罰款與iOS 4.3以下錯誤:的iOS 5 AVPlayerItem的實例被釋放

的AVPlayerItem類的實例0x168da0被釋放,而鍵值觀察者仍然在其中註冊。觀察信息被泄露,甚至可能被錯誤地附加到其他物體上。在NSKVODeallocateBreak上設置一個斷點,在調試器中停止。下面是當前觀測信息: ( 語境:爲0x0,物業:0x10b570> 語境:爲0x0,物業:0x117ab0>

下面是代碼片段:

MPMoviePlayerController *moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL:[appDelegate.mediaManager loadVideo:[element valueForAttributeNamed:@"value"]]]; 

     //create a NSNotificationCenter which call moviePlaybackComplete function when video playback finished 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlaybackComplete:) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayerController]; 

     //display the moviePlayer view 
     [self.view addSubview:moviePlayerController.view]; 
     moviePlayerController.fullscreen = YES; 
     [moviePlayerController play]; 

回答

-5

我已經收到了同樣的錯誤並簡單地當視圖消失將清除泄漏刪除觀察者。

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

willWillDisappeardealloc

+2

NSNotificationCenter!= KVO。你正在混合兩種完全不同的技術。 – steipete

+1

他問的是'MPMoviePlayerPlaybackDidFinishNotification'那不是KVO –

+0

willWillDisappear?你的意思是viewWillDisappear? :) – Sabobin

13

編輯剛剛發佈的答案下面我注意到,每當控制器被重新分配後,這些錯誤回來的舊控制器得到自動釋放,即使我設置絕對沒有通知處理器我。由於故障來自MP框架內的代碼,我想說這似乎是一個操作系統錯誤。

我遇到了與使用ARC的基於故事板的iOS 5項目相同的問題。問題是在堆棧中使用臨時變量來引用電影控制器 - 在我的情況下,我假定與ARC進行交互,但它可能比這更爲基礎。在任何情況下,它看起來好像有些東西會被釋放/過早丟失(例如,當播放出現錯誤時),並且日誌被您描述的那種輸出填充。

將電影控制器引用存儲在擁有類中定義的屬性中解決了這個問題;即:

@interface MyClass 
@property (strong, nonatomic) MPMoviePlayerViewController * movieController; 
@end 

@@implementation MyClass 
@synthesize movieController = _movieController; 

// ...then later, this: 
// 
// MPMoviePlayerController *moviePlayerController = [...]; 
// 
// ...becomes: 

self.movieController = [...]; 

如果您是設置之前,使用合成的存取的屬性是否然後您使用手動或自動的引用計數所生成的設置方法應該正確解除分配舊電影控制器(如果有的話)新的那一個。作爲腳註,如果您在MPMoviePlayerPlaybackDidFinishNotification通知處理程序中手動釋放/'unreference'(設置爲nil)屬性,那麼您可能會注意到錯誤又回來了。所以不要這樣做:-)

+5

這是一個oldie,但只是萬一任何人都有同樣的問題,MPMoviePlayerController似乎並不喜歡某些NSURLs,即使它們被視爲有效的對象。 「祕密」是以NSString的形式獲取文件路徑,然後使用'[NSURL fileURLWithPath:URLStringPath]'來創建您用於創建MPMoviePlayerController實例的URL。 – Rog

+0

你爲我節省了不計其數的時間。偉大的工作研究。我正在拉我的頭髮。 – SteveB

0

啊。你從SomethingElse對象觀察TekkPoint對象,SomethingElse對象是添加和刪除觀察者的對象,對嗎? (這是正常的做法;我只是想澄清)

它看起來像你的TekkPoint對象被釋放,而SomethingElse觀察它仍在。 SomethingElse dealloc方法沒有被調用,因爲它是被釋放的TekkPoint,而不是SomethingElse。

如果您打算觀察在觀察者消失之前可能消失的物體,那麼您需要某種方式通知觀察者他們應該移除觀察者。你的TekkPoint可能有一個活潑的屬性,這也會被SomethingElse觀察到,當它被設置爲NO時,那麼每個觀察TekkPoint的人都會以觀察者身份移除它們。

相關問題