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