0

私のアプリの1つで、ファイルを再生するために以下のコードを使用してlocal.soiamからビデオファイルを再生したいと思います。

-(IBAction)playMovie{

NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"Myvideo" ofType:@"mov"]];

MPMoviePlayerController *moviePlayer=[[[MPMoviePlayerController alloc]initWithContentURL:url]autorelease];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(moviePlayBackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer];

moviePlayer.controlStyle = MPMovieControlStyleEmbedded;
moviePlayer.shouldAutoplay = YES;

[self.view addSubview:moviePlayer.view];
[moviePlayer setFullscreen:YES animated:YES];
//[moviePlayer release];
}

-(void) moviePlayBackDidFinish:(NSNotification*)notification {

MPMoviePlayerController *moviePlayer = [notification object];

[[NSNotificationCenter defaultCenter] removeObserver:self      
                                                name:MPMoviePlayerPlaybackDidFinishNotification
                                              object:moviePlayer];
if ([moviePlayer 
     respondsToSelector:@selector(setFullscreen:animated:)])
{
   [moviePlayer.view removeFromSuperview];
}
[moviePlayer release];

}

上記のコードの分析またはプロファイルを実行すると、2か所で警告の潜在的なリークが発生していることがわかります。

[moviePlayer setFullscreen:YES animated:YES];

//[moviePlayer release];

もう1つはリークがこの部分にあります

{

  [moviePlayer.view removeFromSuperview];

}
[moviePlayer release]

コードの最初にNSURL行を自動解放しようとしても、自動解放リークは発生しませんが、ビデオは再生されません。この問題を解決する方法は誰か助けてくれますか?

4

1 に答える 1

0

moviePlayBackDidFinish メソッドでこれを試してみてください。

 if (videoPlayer) {
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:MPMoviePlayerPlaybackDidFinishNotification object:videoPlayer];

    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:MPMoviePlayerLoadStateDidChangeNotification object:videoPlayer];

    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:MPMovieMediaTypesAvailableNotification object:videoPlayer];
    [videoPlayer pause];
    videoPlayer.initialPlaybackTime = -1;
    [videoPlayer stop];
    [videoPlayer.view removeFromSuperview];
    [videoPlayer release];
    videoPlayer = nil;
} 
于 2012-10-04T09:54:45.193 に答える