2015-08-28 3 views
0

WI имеет приложение для iPad-киосков, которое отображает видео на внешнем мониторе, подключенном к iPad через HDMI. У меня есть viewController, который управляет представлением на внешнем мониторе. Когда я закончил воспроизведение видео, я извиню экземпляр MPMoviePlayerController. В iOS7 это работает отлично, но в iOS8 я получаю жесткий сбой после установки moviePlayer на nil.Установка объекта в nil iOS7 vs iOS8

- (void)removeMoviePlayer { 
[self.moviePlayerController.view removeFromSuperview]; 
[self removeMovieNotificationHandlers]; 
self.moviePlayerController = nil;} 

С Zombies включен я получаю сообщение в отладчике:

[MPAVController release]: message sent to deallocated instance 

Опять же, этот крах не происходит, когда приложение работает под iOS7. Что изменилось, что вызвало этот крах?

+0

Что 'себя removeMovieNotificationHandlers' делать? – matt

+1

Было бы неплохо, если бы вы добавили строку, в которой произошел сбой. (Исключительная точка останова) –

+0

Нет необходимости в изменении, которое может указать кто-то, - гораздо более вероятно, что у вас есть незначительное неявное неправильное использование где-то, что технически означает, что ваше приложение имеет неопределенное поведение. Неопределенное поведение в возрасте до 7 лет не должно коррелировать с неопределенным поведением в 8. Вопрос один: используете ли вы ARC? – Tommy

ответ

0

После нескольких дней проб и ошибок я обнаружил, что при попытке уничтожить экземпляр MPMoviePlayerController, когда MPMoviePlayerPlaybackState был MPMoviePlaybackStatePaused, приложение потерпит крах. Когда видео достигает конца, MPMoviePlayerController отправляет уведомление MPMoviePlaybackDidFinish, которое сообщает о состоянии воспроизведения как MPMoviePlaybackStatePaused. Исправлена ​​ошибка проверки состояния воспроизведения и приостановки вызова [останов MPMoviePlayerController]. Это изменяет MPMoviePlaybackState на MPMoviePlaybackStateStopped, и вы можете затем удалить экземпляр без сбоя.

Этот крах не произойдет до прошивки 8. Код ниже:

 
-(void)moviePlayBackDidFinish:(NSNotification *)notification { 
    [self stopVideo:notification]; 
} 

- (void)stopVideo:(NSNotification *)notification { 
    if (self.moviePlayerController) { 
     if (self.moviePlayerController.playbackState == MPMoviePlaybackStatePlaying || self.moviePlayerController.playbackState == MPMoviePlaybackStatePaused) { 
      [self.moviePlayerController stop]; 
     } 
     [self cleanUpVideo]; 
    } 
} 

- (void)cleanUpVideo { 
    [self killProgressTimer]; 

    [UIView animateWithDuration:1.0f animations:^{ 
     self.closedCaptionLabel.alpha = 0.0f; 
     self.moviePlayerController.view.alpha = 0.0f; 
     self.backgroundImageView.alpha = 1.0f; 
    } completion:^(BOOL finished) { 
     [self removeMoviePlayer]; 
     [self resetClosedCaptions]; 
     [self.delegate videoDidStop]; 
    }]; 
} 

- (void)removeMoviePlayer { 
    [self.moviePlayerController.view removeFromSuperview]; 
    [self removeMovieNotificationHandlers]; 
    self.moviePlayerController = nil; 

} 
Смежные вопросы