AVPlayerItem已取消分配,而键值观察者仍在其中注册

时间:2017-01-04 09:55:22

标签: ios objective-c avplayer avplayeritem

viewDidAppear我正在注册观察员:

[self.avPlayer addObserver:self forKeyPath:@"rate" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
isRate = YES;

[playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
isStatus = YES;

[playerItem addObserver:self forKeyPath:@"playbackBufferEmpty" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
isPlayback = YES;

viewDidDisappear中,我正在非常安全地取消注册(以避免任何例外)

@try {
    if (isStatus && self.avPlayer && self.avPlayer.currentItem) {
        [self.avPlayer.currentItem removeObserver:self forKeyPath:@"status"];
    }
    if (isPlayback && self.avPlayer && self.avPlayer.currentItem) {
        [self.avPlayer.currentItem removeObserver:self forKeyPath:@"playbackBufferEmpty"];
    }
    if (isRate && self.avPlayer) {
        [self.avPlayer removeObserver:self forKeyPath:@"rate"];
    }
} @catch (NSException *ex) {
    NSLog(@"Exception thrown while removing observer(s) %@", ex);
}

即使采取了所有预防措施,我也会看到应用程序崩溃,并且我看到了新文物

  

AVPlayerItem类的实例0x1742046c0在释放时被释放   关键价值观察员仍在注册。目前的观察   info :(上下文:0x0,属性:0x174643810>    语境:   0x0,属性:0x17465f800> )

我还能做些什么来避免崩溃?

我在做什么?我正在滑动视频播放器以转移到另一个视频播放器。因此,有可能钥匙首先没有注册。

玩家项目声明:

AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:url options:nil];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:avAsset];
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];
self.avPlayer = [AVPlayer playerWithPlayerItem:playerItem];

0 个答案:

没有答案