相关疑难解决方法(0)

NSKeyValueObservation:无法从对象中删除关键路径的观察者,因为它未注册为观察者

我在我的应用程序中遇到随机崩溃(我无法在我拥有的设备上重现),例外情况:

无法从AVPlayerLayer 0xaddress中删除关键路径"readyForDisplay"的观察者Foundation.NSKeyValueObservation 0xaddress,因为它未注册为观察者.

当我释放包含AVPlayerLayer的UIView时会发生这种情况.

我的初学者:

private var playerLayer : AVPlayerLayer { return self.layer as! AVPlayerLayer }

init(withURL url : URL) {
    ...
    self.asset = AVURLAsset(url: url)
    self.playerItem = AVPlayerItem(asset: self.asset)
    self.avPlayer = AVPlayer(playerItem: self.playerItem)
    super.init(frame: .zero)
    ...
    let avPlayerLayerIsReadyForDisplayObs = self.playerLayer.observe(\AVPlayerLayer.isReadyForDisplay, options: [.new]) { [weak self] (plLayer, change) in ... }
    self.kvoPlayerObservers = [..., avPlayerLayerIsReadyForDisplayObs, ...]
    ...
    }
Run Code Online (Sandbox Code Playgroud)

我的deinit抛出异常:

deinit {
    self.kvoPlayerObservers.forEach { $0.invalidate() }
    ...
    NotificationCenter.default.removeObserver(self)
}
Run Code Online (Sandbox Code Playgroud)

根据Crashlytics的说法,它发生在不同iPhone上的iOS 11.4.1上.

导致的代码deinit非常简单:

// Some UIViewController context.
self.viewWithAVLayer?.removeFromSuperview()
self.viewWithAVLayer …
Run Code Online (Sandbox Code Playgroud)

key-value-observing ios avplayerlayer swift

14
推荐指数
1
解决办法
1464
查看次数

标签 统计

avplayerlayer ×1

ios ×1

key-value-observing ×1

swift ×1