代码之家  ›  专栏  ›  技术社区  ›  Cesar

MPMoviePlayerController仍在泄漏

  •  3
  • Cesar  · 技术社区  · 14 年前

    我释放了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 回复  |  直到 12 年前
        1
  •  4
  •   Al-Noor Ladhani    14 年前

    iPad用来预装视频流的缓存没有完全清空。

    这实际上不是内存泄漏:

    经过一番认真的努力,这一系列命令似乎完成了任务:

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

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

    步骤:

    2-暂停电影

    3-将播放时间设置为开始

    4-停止电影

    6-现在移除电影视图

    7-最终发布电影播放器

    导致我的iPad(OS4.2)上的视频缓存也被释放 并留下一个干净的内存分配情况,大小等于视频播放器打开页面之前的大小。同样的进入和退出记忆。

    希望这有帮助。。。。。。

        2
  •  0
  •   pop850    14 年前

    您是否尝试过构建和分析(Build>构建和分析),这可以向您显示确切的行内存正在泄漏(如果有的话)。

    现在,我有种感觉,问题在于你如何定义 NSURL .

        3
  •  0
  •   iwasrobbed    14 年前

    你是在设备上还是在模拟器上运行这个代码?模拟器给出了一系列错误的泄漏(比如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];