Как вы выпускаете MPMoviePlayerViewController после завершения воспроизведения? - PullRequest
0 голосов
/ 22 марта 2012

Я использую MPMoviePlayerViewController для воспроизведения видео в iOS.Когда видео останавливается или вылетает, я хотел бы закрыть этот контроллер просмотра и выпустить его.Чтобы симулировать сбой, я передал несуществующий путь к файлу:

MPMoviePlayerViewController* p = [
    [MPMoviePlayerViewController alloc] init
];
self.player = p;
[p release];
[[NSNotificationCenter defaultCenter] 
    addObserver:self
    selector:@selector(moviePlayBackDidFinish:)
    name:MPMoviePlayerPlaybackDidFinishNotification
    object:self.player.moviePlayer
];
self.player.moviePlayer.contentURL = @"purposelyFake.mp4";

Это немедленно вызовет следующий обратный вызов.

- (void) moviePlayBackDidFinish
{
    if (self.player != nil) {
        [self.player.moviePlayer stop];
        self.player = nil
    }
}

self.player является неатомарным сохраненным свойством, поэтому установка его на nil должна освободить его.Это очищает память, но мой журнал показывает это предупреждение:

Экземпляр 0x127b20 класса AVPlayerItem был освобожден, в то время как наблюдатели значения ключа все еще были зарегистрированы в нем.Информация наблюдений была утечка, и даже может быть ошибочно привязана к какому-либо другому объекту.Установите точку останова на NSKVODeallocateBreak, чтобы остановиться здесь в отладчике.

Причина в том, что moviePlayBackDidFinish вызывается дважды при сбое видео.Один раз сказать MPMovieFinishReasonPlaybackEnded и еще раз сказать MPMovieFinishReasonPlaybackError.MPMoviePlayerViewController освобождается, пока второе уведомление все еще отправляется.Мой вопрос: как мне избавиться от этого предупреждения?Имейте в виду, что при нормальном завершении воспроизведения выдается только MPMovieFinishReasonPlaybackEnded, поэтому я не могу просто жестко закодировать его, чтобы выпускать только при получении двух уведомлений подряд.

1 Ответ

0 голосов
/ 22 марта 2012

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

[[NSNotificationCenter defaultCenter] removeObserver: self name: MPMoviePlayerPlaybackDidFinishNotification object: myMPMoviePlayerController];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...