在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];