MPMoviePlayerController: высокое использование памяти (не освобождается) - PullRequest
1 голос
/ 19 августа 2010

Я использую MPMoviePlayerController в своем приложении для iPhone, чтобы иногда показывать несколько коротких видеоклипов.Я объявил категорию, которая объявляет пару методов к классу, чтобы правильно прикрепить его представление к определенному представлению и удалить его оттуда.Я использую систему уведомлений, чтобы сообщить классу, когда фильм закончился, и пытаюсь удалить его.Вот методы в категории:

- (void)setViewInCurrentController{  
    LPAppDelegate * appDelegate = [[UIApplication sharedApplication] delegate];
    self.view.frame = CGRectMake(0, 0, 320, 480);
    self.view.alpha = 0.0;

    [appDelegate.window addSubview:self.view];
    [UIView beginAnimations:@"FadeIn" context:nil];
    [UIView setAnimationDuration:0.3];
    [UIView setAnimationBeginsFromCurrentState:YES];
    self.view.alpha = 1.0;
    [UIView commitAnimations];

}
- (void)removeViewInCurrentController{

    [UIView beginAnimations:@"FadeOut" context:nil];
    [UIView setAnimationDuration:0.3];
    [UIView setAnimationBeginsFromCurrentState:YES];
    self.view.alpha = 0.0;
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(removeFromSuperview)];
    [UIView commitAnimations];
} 

А вот где я использую MPMoviePlayer:

- (void)playVideoNarration:(VideoNarration *)vNarr{
    MPMoviePlayerController *player = [[MPMoviePlayerController alloc] 
                                       initWithContentURL:[NSURL fileURLWithPath:vNarr.videoURI]];
    [[NSNotificationCenter defaultCenter] 
                             addObserver:self
                                selector:@selector(videoNarrationFinishedPlaying:)                                                 
                                    name:MPMoviePlayerPlaybackDidFinishNotification
                                  object:player];

    [player setViewInCurrentController];
    player.controlStyle = MPMovieControlStyleNone;
    [player play]; 
}

- (void)videoNarrationFinishedPlaying:(NSNotification *) aNotification{

    MPMoviePlayerController * player = [aNotification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:MPMoviePlayerPlaybackDidFinishNotification
                                                  object:player];
    [player removeViewInCurrentController];
    [player release];
}

Видео показывается правильно, а затем проигрыватель удаляется из видадумаю, оно тоже освобождается, но когда я вижу приложение с Инструментом Распределения Инструментов, я вижу, что выделенная память достигает 20+ МБ и не освобождается после завершения проигрывателя.Ответственным за распределение является библиотека под названием VideoToolBox.

Нет утечек, кроме некоторых из библиотеки AudioToolBox.Есть предположения о том, что происходит?

1 Ответ

2 голосов
/ 20 августа 2010

Решение этой проблемы, по-видимому, таково: вам нужно позвонить на [player stop], прежде чем отпустить его.Это выглядит немного странно, так как я уже получаю уведомление о том, что игрок закончил играть.При этом память освобождается (остается лишь небольшое количество, ~ 100 КБ от CoreMedia, но я считаю, что это нормально

...