MPMoviePlayerViewController iPad内存泄漏

时间:2010-10-04 17:36:52

标签: ipad memory mpmovieplayercontroller memory-leaks mpmovieplayer

我的电影播放器​​仅在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 *控制器,但是当我点击完成按钮时它总是会泄漏。

非常感谢任何帮助。感谢。

3 个答案:

答案 0 :(得分:0)

删除观察者时,MPMoviePlayer实例已保留并自动释放。使用autorelease包装remove observer代码将使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;

答案 1 :(得分:0)

您忘了将moviePlayer发布到init附近。你可以这样做:

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];

答案 2 :(得分:0)

我有同样的问题。为了在没有内存泄漏的情况下阻止它,我必须快进到最后几秒,以便它可以自己完成。

但后来我发现这个泄漏只发生在iPad模拟器上。如果你在设备上运行它就没问题。

相关问题