MPMoviePlayerController仍然泄漏

我释放了MPMoviePlayerController,但内存分配和活动对象仍然高于对象分配之前。 但是,如果我重新分配对象,它不会泄漏更多。 我的应用程序实际上使用了很多媒体文件,内存消耗也很高。 我想完全释放不需要的内存以避免内存警告。

电影播放器​​版本:

player.initialPlaybackTime = -1; [player.view removeFromSuperview]; [player stop]; [player release]; 

电影播放器​​分配:

  NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"video0_hd.mov" ofType:nil]]; player = [[MPMoviePlayerController alloc] initWithContentURL:url]; player.view.frame = placeholder.frame; [self.view addSubview:player.view]; [player play]; 

我也有这个问题。

iPad用于预加载videostream的caching并未完全清空。 所以每次这个带有video播放器的页面都被清理并释放,清理后分配的内存仍然包含caching的内存。 对于大video,这可能高达50 MB。

这实际上不是内存泄漏:

如果页面再次打开,caching被重新分配。 但是,当你想要一个干净的退出情况,意味着当这个页面被留下和清理时,这个页面所使用的所有内存都应该被释放,包括用于cachingvideostream的内存。

经过一番严肃的调整之后,这个命令序列似乎可以胜任:

======================

  [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:myMoviePlayer]; [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerDidExitFullscreenNotification object:myMoviePlayer]; [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerLoadStateDidChangeNotification object:myMoviePlayer]; [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMovieDurationAvailableNotification object:myMoviePlayer]; [myMoviePlayer pause]; myMoviePlayer.initialPlaybackTime = -1; [myMoviePlayer stop]; myMoviePlayer.initialPlaybackTime = -1; [myMoviePlayer.view removeFromSuperview]; [myMoviePlayer release]; 

=================================

在步骤中:

1 – 删除您的电影播放器​​使用的所有通知。

2 – 暂停电影

3 – 设置播放时间开始

4 – 停止电影

5 – 再次设置播放时间以启动

6 – 现在删除电影视图

7 – 最后放出电影播放器

结果在我的情况下,在我的iPad(OS 4.2。)上释放videocaching内存,并留下一个干净的分配内存的情况下,等于与video播放器的页面之前的大小是开放的。 所以同样进入和退出内存。

希望这可以帮助……

你有没有尝试过构build和分析(构build>构build和分析),这可能会告诉你确切的内存泄漏(如果有的话)。

现在,我有一个感觉,问题是你定义NSURL

你是在设备上还是在模拟器上运行这个代码? 模拟器给出了大量的错误泄漏(如AudioToolbox,CoreVideo等)。 而且,模拟器似乎caching整个video,而不是正确释放它,而设备缓冲只是沿途所需。

我使用mp4video在模拟器上testing了您的代码,并且与您所说的相同(每次播放video时有10个活动对象,没有死亡… 20MB分配,甚至在释放后还剩5MB)。 模拟器上的生物和内存分配将继续增长和增长。

然而,在我的iPhone(20mbvideo),它只分配了900kb的应用程序的总内存,启动/停止/释放video没有明显的变化。 在我testing的10次(开始/停止/释放)时,它始终保持在900kb左右。

看起来就像又一次你不能相信模拟器。

我正在testing的代码是:

 NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"SomeMovieFile" ofType:@"mp4"]]; MPMoviePlayerController *newPlayer = [[MPMoviePlayerController alloc] initWithContentURL:url]; self.player = newPlayer; [newPlayer release]; [self.view addSubview:player.view]; // for my example, I didn't set the frame location, but no difference that would do [player play]; 

然后在另一个button,我停下来,释放玩家:

 [player.view removeFromSuperview]; player.initialPlaybackTime = -1; [player stop]; self.player = nil; // this is just a habit of mine.. calling stop should unload the buffers though [player release];