在发布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];
}
编辑:添加了图片。美丽的3MB malloc就是它的辉煌。
你可以看到另一块内存不再存在,但我仍有一个重大问题。 在此先感谢您的帮助
答案 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对象。
非常感谢你的回答。特别是巴斯蒂安对我的问题的评论,这是解决这个问题的关键。