我发布了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];
答案 0 :(得分:4)
我也有这个问题。
iPad用于预加载视频流的缓存未完全清空。 所以每次清理和释放这个带有视频播放器的页面时,清理后分配的内存仍然包含缓存的内存。对于大视频,这可能高达50 MB。
这实际上不是内存泄漏:
如果再次打开页面,则重新分配缓存。但是仍然令人沮丧,因为你想要一个干净的退出情况,这意味着当这个页面被放下并清理时,应该释放这个页面使用的所有内存,包括用于缓存视频流的内存....!
经过一些严肃的推文后,这一系列命令似乎可以完成这项工作:
======================
[[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)。 并留下一个干净的分配内存情况,等于播放视频播放器的页面之前的大小。同样进入和退出记忆。
希望这会有所帮助......
答案 1 :(得分:0)
您是否尝试过构建和分析(构建>构建和分析),这可能会向您显示确切的内存泄漏(如果有)。
现在,我感觉问题在于您定义NSURL
。
答案 2 :(得分:0)
您是在设备上还是在模拟器上运行此代码?模拟器提供了一堆虚假泄漏(例如AudioToolbox,CoreVideo等)。此外,模拟器似乎缓存整个视频而不是正确释放它,而设备只缓冲它在整个过程中所需的内容。
我在模拟器上使用mp4视频测试了你的代码,我得到了与你所说的相似的结果(每次播放一个视频时有10个活动对象,没有死亡......分配了20mb,甚至在释放后还剩下5mb )。生物和内存分配将在模拟器上不断增长和发展。
然而,在我的iPhone上(带有20mb视频),它只为应用程序分配了900kb的内存,在启动/停止/释放视频时没有明显的变化。我测试它的10次(开始/停止/释放)总是保持在900kb左右。
看起来只是另一次你无法信任模拟器。
我正在测试的代码:
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];
然后在另一个按钮中我停下来并释放了玩家:
[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];