0

ムービー プレーヤーでメモリ リークが発生するのは、iPad でのみ、[完了] ボタンをクリックしたときだけです。ムービーが最後まで再生されると、適切にクリーンアップされます。プレイコードは次のとおりです。

mViewPlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:[self movieURL:@"mymovie"]];
[self.parentViewController presentModalViewController:mViewPlayer animated:YES];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitedFullscreen:) name:MPMoviePlayerPlaybackDidFinishNotification object:[mViewPlayer moviePlayer]];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitedFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:[mViewPlayer moviePlayer]];

そして、ここにクリーンアップコードがあります:

- (void)exitedFullscreen:(NSNotification*)aNotification 
{
 MPMoviePlayerController *player = [aNotification object];
 [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:player];
 [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerDidExitFullscreenNotification object:player];

 [self.parentViewController dismissModalViewControllerAnimated:YES];
 NSLog(@"retainCount theMovie: %i", [mViewPlayer retainCount]); 
 player.initialPlaybackTime = -1;
 [player pause];
 [player stop];
 NSLog(@"retainCount theMovie: %i", [mViewPlayer retainCount]); 
 [player release];
 player = nil;
// [mViewPlayer release];
 mViewPlayer = nil;
}

正常に終了した場合と「完了」ボタンをクリックした場合の両方で、retainCount は 3 です。

MPMoviePlayerController も同じ結果で使用してみました。準備された再生と 10 の異なるメソッドを使用して MPMoviePlayer*Controller を呼び出してみましたが、[完了] ボタンをクリックすると常にリークします。

どんな助けでも大歓迎です。ありがとう。

4

3 に答える 3

0

オブザーバーを削除すると、MPMoviePlayerインスタンスは自動リリースで保持されます。オブザーバーの削除コードを自動解放でラップすると、retainCountが期待どおりになります。

このような:

// remove all observers
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // following messages adds to autorelease pool
[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:player];
[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerDidExitFullscreenNotification object:player];
[pool drain], pool = nil;
于 2010-11-03T14:11:36.363 に答える
0

init の近くで moviePlayer を解放するのを忘れました。次のようにできます。

mViewPlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:[self movieURL:@"mymovie"]];
[self.parentViewController presentModalViewController:mViewPlayer animated:YES];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitedFullscreen:) name:MPMoviePlayerPlaybackDidFinishNotification object:[mViewPlayer moviePlayer]];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitedFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:[mViewPlayer moviePlayer]];
[mViewPlayer release];
于 2010-11-10T09:22:53.097 に答える
0

私も同じ問題を抱えてる。メモリ リークを起こさずに停止するには、最後の数秒まで早送りして、自動的に完了するようにする必要があります。

しかし、後で、このリークが iPad シミュレーターにのみあることがわかりました。デバイスで実行すれば問題ありません。

于 2011-08-12T08:30:39.767 に答える