【问题标题】:Huge memory leak after using MPMoviePlayerController使用 MPMoviePlayerController 后出现巨大的内存泄漏
【发布时间】:2011-04-01 10:14:29
【问题描述】:

在释放 MPMoviePlayerController 对象后,我在 iPad 应用上遇到了 CoreVideo 完成的 3MB malloc。

我已确保播放器在释放之前停止,因此它确实确实释放了内存并正确释放。问题是仪器一直显示这个尚未发布的malloc(并且我没有在我的代码中直接使用) 这是在仪器中显示为从未发布的 3.52MB Malloc 的负责调用者的调用。

CVPixelBufferBacking::initWithPixelBufferDescription

这是停止播放器并释放包含它们的数组的代码

- (void)dealloc {
...


[self stopAllPlayers];
[_moviePlayerViewControllerArray release];

[super dealloc];
}

-(void)stopAllPlayers {
    for (MPMoviePlayerController *mp in _moviePlayerViewControllerArray) {
        [mp stop];

    }
}

这是添加视频的方法

-(void)addVideo:(NSString*) videoName onRect:(CGRect)rect {



 ......

    MPMoviePlayerController * movieController= [[MPMoviePlayerController alloc]initWithContentURL:(NSURL *)videoURL];

    // set frame for player
    movieController.view.frame = rect;

    // set  auto resizing masks
    [movieController.view setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight];

    // don't auto play.
    [movieController setShouldAutoplay:NO];

    [pdfView addSubview:movieController.view];
    [pdfView bringSubviewToFront: movieController.view];


    [_moviePlayerViewControllerArray addObject:movieController];
    [movieController release];

}

编辑:添加图像。美丽的 3MB malloc 尽显荣耀。

如您所见,另一块内存不再存在,但我仍然有一个大问题。 提前感谢您的帮助

【问题讨论】:

  • 请用您的代码 sn-p 和仪器屏幕截图更新您的问题,也许我可以帮助您。
  • 嘿,我刚刚添加了sn-ps和截图! :-)
  • 你是在设备上还是在模拟器上测试过?我认为电影控制器的情况存在一些差异。
  • 确实你是对的。我现在有一大块 8MB 的 CoreGraphics,负责的调用者是 CGDataProviderCreateWithFileName

标签: iphone objective-c memory-management memory-leaks instruments


【解决方案1】:

你会吗

[movieController.view removeFromSuperview]

某处?

【讨论】:

  • 不,我只是发布它。我要试一试。
【解决方案2】:

以这种方式添加电影完成回调 -

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:[playerViewController moviePlayer]];

并在这个回调方法中释放和移除播放器 -

- (void) movieFinishedCallback:(NSNotification*) aNotification {
MPMoviePlayerController *player1 = [aNotification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification  object:player];
    [player1 stop];
    [player1.view removeFromSuperview];
    [player1 release];
}

【讨论】:

  • 为什么播放结束后要删除它?它可能处于全屏模式,如果立即删除它看起来不太好,或者应该可以再次观看电影......
  • 我不想在播放完电影后删除视图控制器。
  • 那么它会泄漏你的内存,因为你在电影结束后引用它
  • 是的......它违反了“removeFromSuperview”也会释放对象的内存管理规则,然后如果我们再次释放它,它将抛出 exc 错误访问但它的工作......我也想知道它!
【解决方案3】:

我终于解决了这个问题。当我在设备上测试该应用程序时,CoreVideo 上的泄漏将其名称更改为“”。潜伏在某些论坛上,我发现这主要是由于核心图形“对象”被自动释放但从未被自动释放池释放。

基本上,无论我在哪里创建和使用 Core Graphics 对象,我都会添加 NSAutoReleasePool 对象以及时处置 CG 对象。

非常感谢您的回答。特别感谢巴斯蒂安对我的问题的评论,这是解决这个问题的关键。

【讨论】:

    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多