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

您忘记在 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 回答
0

When removing observer the MPMoviePlayer instance has been retained with an autorelease. Wrapping the remove observer code with an autorelease will make the retainCount be as expected.

Like this:

// 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 回答