AVPlayer was deallocated while key value observers were still registered with it AVPlayer was deallocated while key value observers were still registered with it ios ios

AVPlayer was deallocated while key value observers were still registered with it


I had a similar problem. It worked fine in iOS 7, and now it crashes in iOS 8.

The solution was to remove the observer, before releasing the object.

When you replace or allocate a new object for a member, you're releasing the old object, so you need to remove the observer first :

-(void) setupAVPlayerForURL: (NSURL*) url1 {    AVAsset *asset = [AVURLAsset URLAssetWithURL:url1 options:nil];    AVPlayerItem *anItem = [AVPlayerItem playerItemWithAsset:asset];    if (player != nil)        [player removeObserver:self forKeyPath:@"status"];    player = [AVPlayer playerWithPlayerItem:anItem];     [player addObserver:self forKeyPath:@"status" options:0 context:nil];}

And similarly in btnPlayClick ( in case it is pressed without btnStop_Click being pressed) :

- (IBAction)btnPlay_Click:(id)sender {     if (player != nil && [player currentItem] != nil)         [[player currentItem] removeObserver:self forKeyPath:@"timedMetadata"];    AVPlayerItem *item = player.currentItem;    [item addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionInitial|     NSKeyValueObservingOptionNew| NSKeyValueObservingOptionOld| NSKeyValueObservingOptionPrior context:nil];    [player play];}


-(void)viewWillDisappear:(BOOL)animated{[self.player removeObserver:self forKeyPath:@"status" context:nil];}


When using KVO you must balance calls to addObserver:forKeyPath:options:context: with calls to removeObserver:forKeyPath: (see the KVO programming guide).

Try removing the view controller as an observer when the stop button is tapped e.g.

- (IBAction)btnStop_Click:(id)sender {    [[player currentItem] removeObserver:self forKeyPath:@"timedMetadata"];}