2012-03-22 18 views
0

私はMPMoviePlayerViewControllerを使ってiOSでビデオを再生しています。ビデオが停止またはクラッシュすると、私はこのView Controllerを閉じてリリースしたいと思います。クラッシュをシミュレートするために、私は存在しないファイルパスに渡されました:これは直後にコールバックをトリガする再生終了後に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は、2番目の通知がまだ送信されている間に割り当てが解除されます。私の質問は、この警告をどうやって取り除くのですか?通常の再生終了時にはMPMovieFinishReasonPlaybackEndedしか発行されないので、2つの通知を連続して受信するたびにリリースするようにハードコードすることはできません。

答えて

0

あなたのコールバックメソッドでは、あなたがそれをリリースする前に通知のオブザーバーとして自分自身を削除してみてください。

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

私はまだ同じ警告を受け取ります。 – JoJo

関連する問題