使用MPMoviePlayerController后出现大量内存泄漏

时间:2011-04-01 10:14:29

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

在发布MPMoviePlayerController对象后,我在我的iPad应用程序上遇到了CoreBideo完成的这个3MB malloc。

我已确定播放器在发布之前已停止,因此它实际上确实释放了内存和deallocs。问题是仪器一直显示这个尚未发布的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];

}

编辑:添加了图片instruments zombies on simulator (obviously)。美丽的3MB malloc就是它的辉煌。

This other screenshot is the allocations instruments running on the ipad.e 你可以看到另一块内存不再存在,但我仍有一个重大问题。 在此先感谢您的帮助

3 个答案:

答案 0 :(得分:1)

你做了

吗?
[movieController.view removeFromSuperview]
某处?

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

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