【问题标题】:MPMoviePlayerViewController iPad Memory LeakMPMoviePlayerViewController iPad 内存泄漏
【发布时间】:2010-10-04 17:36:51
【问题描述】:

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

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: ipad memory mpmovieplayercontroller memory-leaks mpmovieplayer


    【解决方案1】:

    删除观察者时,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;
    

    【讨论】:

    • 不幸的是,这似乎并没有改变任何东西。不过,感谢您的回复。看起来这个问题在 iPad 4.2 在模拟器和设备上都不是问题。
    • 好吧,当你知道你得到了正确的数字时,现在检查对象上的 retainCount 会容易得多。你只需要找到它得到一个保留太多的地方。
    • 好消息是模拟器和设备上的 iPad 4.2 不再泄漏内存。绝对是 3.2 代码中的错误。
    【解决方案2】:

    你忘记在 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];
    

    【讨论】:

    • 谢谢,不幸的是,我需要在我的实际程序中将播放器传递给我的电影播放器​​退出代码,并在此处释放它在我的退出代码中崩溃。也许这会起作用,并且不会产生 3 保留计数。
    • 如果你像我说的那样释放它,那么在关闭 modalviewcontroller 时你不应该释放它。 modalviewcontrol-display-thingy 保留它,并在关闭时释放它。
    【解决方案3】:

    我也有同样的问题。为了在不发生内存泄漏的情况下停止它,我必须快进到最后几秒钟,这样它才能自行完成。

    但后来我发现这个泄漏只在 iPad 模拟器上。如果你在设备上运行它很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      相关资源
      最近更新 更多