iOS 5 экземпляр AVPlayerItem был освобожден - PullRequest
6 голосов
/ 07 ноября 2011

Когда я пытаюсь воспроизвести видео с моего iPhone (находится в каталоге Documents), я получаю следующую ошибку при использовании iOS 5, когда она нормально работала с iOS 4.3:

Экземпляр 0x168da0 класса AVPlayerItem былосвобождены, пока наблюдатели с ключевыми значениями все еще были зарегистрированы.Информация наблюдений была утечка, и даже может быть ошибочно привязана к какому-либо другому объекту.Установите точку останова на NSKVODeallocateBreak, чтобы остановиться здесь в отладчике.Вот текущая информация наблюдения: (Контекст: 0x0, Свойство: 0x10b570> Контекст: 0x0, Свойство: 0x117ab0>

Вот фрагмент кода:

MPMoviePlayerController *moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL:[appDelegate.mediaManager loadVideo:[element valueForAttributeNamed:@"value"]]];  

        //create a NSNotificationCenter which call moviePlaybackComplete function when video playback finished
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlaybackComplete:) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayerController];  

        //display the moviePlayer view
        [self.view addSubview:moviePlayerController.view];
        moviePlayerController.fullscreen = YES;  
        [moviePlayerController play];

Ответы [ 3 ]

13 голосов
/ 02 декабря 2011

РЕДАКТИРОВАТЬ : Сразу после публикации ответа ниже я заметил, что всякий раз, когда контроллер перераспределяется, ошибки возвращаются, когда старый контроллер автоматически освобождается, даже если я не настроил обработчики уведомлений.себя.Поскольку сбои происходят из кода внутри платформы MP, я бы сказал, что это, похоже, ошибка ОС.

Я столкнулся с той же проблемой в проекте iOS 5 на основе раскадровки с использованием ARC.Проблема заключается в использовании временной переменной в стеке для ссылки на контроллер фильма - в моем случае я предполагал взаимодействие с ARC, но оно может быть более фундаментальным, чем это.В любом случае это выглядит так, как будто что-то освобождается / теряется слишком рано (например, когда возникает ошибка воспроизведения), и журнал заполняется описанным вами видом вывода.

Хранение ссылки на контроллер видео в свойствеопределено в классе владения, решило это в моем случае;то есть:

@interface MyClass
@property ( strong, nonatomic ) MPMoviePlayerViewController * movieController;
@end

@@implementation MyClass
@synthesize movieController = _movieController;

// ...then later, this:
//
// MPMoviePlayerController *moviePlayerController = [...];
//
// ...becomes:

self.movieController = [...];

Если вы используете синтезированные средства доступа для свойства, то при использовании ручного или автоматического подсчета ссылок метод сгенерированного сеттера должен правильно освободить старый контроллер фильма (если он есть) передустановка нового.

В качестве сноски, если вы (скажем) имеете дело со значениемloc (unleference) (set-to-nil) вручную в обработчике уведомлений MPMoviePlayerPlaybackDidFinishNotification, вы, вероятно, заметите, чтоошибки возвращаются.Так что не делай этого: -)

0 голосов
/ 16 января 2013

Ах.Вы наблюдаете объект TekkPoint из объекта SomethingElse, и объект SomethingElse является тем, который добавляет и удаляет наблюдателей, верно?(Это нормальный способ, которым все делается; я просто пытаюсь уточнить.)

Похоже, ваш объект TekkPoint был освобожден, в то время как SomethingElse, который наблюдает за ним, все еще существует.Метод SomelocElse dealloc не вызывается, потому что освобождается TekkPoint, а не SomethingElse.

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

0 голосов
/ 08 ноября 2011

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

Положите

[[NSNotificationCenter defaultCenter] removeObserver:self];

в willWillDisappear или dealloc

...