MPMoviePlayerController все еще подтекает - PullRequest
3 голосов
/ 02 августа 2010

Я выпускаю 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 ]

4 голосов
/ 07 марта 2011

У меня также была эта проблема.

Кэш, используемый iPad для предварительной загрузки видеопотока, не был полностью очищен.Поэтому каждый раз, когда эта страница с видеопроигрывателем очищалась и освобождалась, выделенная память после очистки все еще содержала кэшированную память.Для больших видео это может быть до 50 МБ.

Это на самом деле не утечка памяти:

Если страница была открыта снова, кэш был перераспределен.Но все равно разочаровывает, поскольку вам нужна чистая ситуация выхода, то есть, когда эта страница оставлена ​​и очищена, вся память, используемая этой страницей, должна быть освобождена, включая память, используемую для кэширования видеопотока ....!

После некоторой серьезной настройки эта последовательность команд, похоже, выполняет свою работу:

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

    [[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.) освобождается кэш-память видео, и в ней остается ситуация с чистой выделенной памятью, равная размеру до открытия страницы с видеоплеером.Так же входите и выходите из памяти.

Надеюсь, это поможет ......

0 голосов
/ 02 августа 2010

Вы запускаете этот код на устройстве или на симуляторе?Симулятор выдает множество ложных утечек (например, в AudioToolbox, CoreVideo и т. Д.).Кроме того, симулятор, похоже, кэширует все видео и не освобождает его должным образом, тогда как устройство буферизует только то, что ему нужно по пути.

Я проверил ваш код на симуляторе с видео mp4и у меня были результаты, аналогичные тому, что вы говорили (10 живых объектов при каждом воспроизведении видео, ни один из которых не умирал ... 20 Мб выделено, и 5 Мб осталось даже после выпуска).Живые объекты и распределение памяти в симуляторе будут расти и расти.

Однако на моем iPhone (с видео 20 Мб) для приложения было выделено всего 900 КБ памяти без заметных изменений при запуске /остановка / выпуск видео.Это всегда оставалось около 900kb в течение 10 раз, когда я тестировал его (запуск / остановка / отпускание).

Похоже, в очередной раз вы не можете доверять симулятору.

Код, с которым я тестировал:

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];
0 голосов
/ 02 августа 2010

Если вы пробовали «Построить и проанализировать» («Построить»> «Построить и проанализировать»), это может показать точную утечку памяти в строке (если есть).

Сейчас у меня ощущение, что проблема в том, где вы определяете NSURL.

...