Я получаю случайные сбои (которые не могу воспроизвести на принадлежащих мне устройствах) в моем приложении, за исключением:
Невозможно удалить наблюдатель Foundation.NSKeyValueObservation 0xaddress для пути ключа «readyForDisplay» изAVPlayerLayer 0xадрес, потому что он не зарегистрирован как наблюдатель.
Это происходит, когда я освобождаю UIView, который содержит AVPlayerLayer.
Мой init:
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, ...]
...
}
Mydeinit, где выдается исключение:
deinit {
self.kvoPlayerObservers.forEach { $0.invalidate() }
...
NotificationCenter.default.removeObserver(self)
}
Согласно Crashlytics это происходит на iOS 11.4.1 на разных iPhone.
Код, ведущий к deinit
, довольно прост:
// Some UIViewController context.
self.viewWithAVLayer?.removeFromSuperview()
self.viewWithAVLayer = nil
Буду признателен за любые мысли о том, почему это происходит.
Я видел этот баг , но мне кажется, что это не причина.
РЕДАКТИРОВАТЬ 1:
Дополнительная информация для потомков.На iOS 10, если я не сделаю недействительной, я получаю воспроизводимый сбой на deinitНа iOS 11 он работает без аннулирования (еще не проверено, если сбой исчезнет, если я не сделаю недействительной и позволю наблюдателям быть deinit
редактированными с моим классом).
РЕДАКТИРОВАТЬ 2:
Дополнительноинформация для потомков: я также нашел эту ошибку Swift, которая может быть связана - SR-6795 .