iur*_*iur 14 key-value-observing ios avplayerlayer swift
我在我的应用程序中遇到随机崩溃(我无法在我拥有的设备上重现),例外情况:
无法从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 = nil
Run Code Online (Sandbox Code Playgroud)
我会很感激为什么会这样.
我已经看到了这个错误,但它似乎不是我的原因.
编辑1:
后人的其他信息.在iOS 10上,如果我没有失效,我会在deinit上获得可重现的崩溃.在iOS 11上它可以无失效地工作(如果我没有失效并且让观察者deinit用我的类编辑,崩溃就会消失).
编辑2:
后代的其他信息:我也发现了这个可能与之相关的Swift bug - SR-6795.
后
self.kvoPlayerObservers.forEach { $0.invalidate() }
Run Code Online (Sandbox Code Playgroud)
加
self.kvoPlayerObservers.removeAll()
Run Code Online (Sandbox Code Playgroud)
我也不喜欢这一行:
self.kvoPlayerObservers = [..., avPlayerLayerIsReadyForDisplayObs, ...]
Run Code Online (Sandbox Code Playgroud)
kvoPlayerObservers 应该是一个Set,您应该在收到它们时逐个插入观察者.
| 归档时间: |
|
| 查看次数: |
1464 次 |
| 最近记录: |