MPMoviePlayerController仍在泄露

时间:2010-08-02 01:04:10

标签: iphone ios memory-management memory-leaks 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];

3 个答案:

答案 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];