Огромная утечка памяти после использования MPMoviePlayerController - PullRequest
0 голосов
/ 01 апреля 2011

Я столкнулся с этим 3 МБ malloc, созданным CoreVideo в моем приложении для iPad после выпуска объекта MPMoviePlayerController.

Я позаботился о том, чтобы проигрыватель был остановлен перед выпуском, поэтому он действительно освобождает память и освобождает должным образом. Дело в том, что инструменты продолжают показывать этот malloc, который еще не был выпущен (и я не использовал его непосредственно в моем коде) Это вызов, который отображается в инструментах как ответственный абонент для 3.52MB Malloc, который так и не был выпущен.

CVPixelBufferBacking::initWithPixelBufferDescription

Вот код, где игроки остановлены и массив, который содержит их, выпущен

- (void)dealloc {
...


[self stopAllPlayers];
[_moviePlayerViewControllerArray release];

[super dealloc];
}

-(void)stopAllPlayers {
    for (MPMoviePlayerController *mp in _moviePlayerViewControllerArray) {
        [mp stop];

    }
}

вот метод, который добавляет видео

-(void)addVideo:(NSString*) videoName onRect:(CGRect)rect {



 ......

    MPMoviePlayerController * movieController= [[MPMoviePlayerController alloc]initWithContentURL:(NSURL *)videoURL];

    // set frame for player
    movieController.view.frame = rect;

    // set  auto resizing masks
    [movieController.view setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight];

    // don't auto play.
    [movieController setShouldAutoplay:NO];

    [pdfView addSubview:movieController.view];
    [pdfView bringSubviewToFront: movieController.view];


    [_moviePlayerViewControllerArray addObject:movieController];
    [movieController release];

}

РЕДАКТИРОВАТЬ: добавлено изображение instruments zombies on simulator (obviously). красивый 3-мегабайтный Malloc во всей своей красе.

This other screenshot is the allocations instruments running on the ipad.e как вы можете видеть, другой части памяти больше нет, но у меня все еще есть большая проблема. заранее спасибо за помощь

Ответы [ 3 ]

1 голос
/ 01 апреля 2011

добавьте обратный вызов фильма таким образом -

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:[playerViewController moviePlayer]];

, а затем отпустите и удалите проигрыватель с помощью этого метода обратного вызова -

- (void) movieFinishedCallback:(NSNotification*) aNotification {
MPMoviePlayerController *player1 = [aNotification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification  object:player];
    [player1 stop];
    [player1.view removeFromSuperview];
    [player1 release];
}
1 голос
/ 05 апреля 2011

Я наконец прибил этот вопрос.Когда я тестировал приложение на устройстве, то, что должно было быть утечкой в ​​CoreVideo, изменило его название на "".Немного покопавшись в некоторых форумах, я обнаружил, что это вызвано главным образом тем, что «объекты» Core Graphic автоматически высвобождаются, но никогда не освобождаются пулом автоматических выпусков.

Практически везде, где я создавал и использовал объекты Core Graphics, я добавлял объекты NSAutoReleasePool для своевременной утилизации объектов CG.

Большое спасибо за ответы.И особенно Бастиану за его комментарий к моему вопросу, который был ключевым для решения этой проблемы.

1 голос
/ 01 апреля 2011

Вы делаете

[movieController.view removeFromSuperview]

где-нибудь?

...