【问题标题】:Stuck in KVO_IS_RETAINING_ALL_OBSERVERS_OF_THIS_OBJECT_IF_IT_CRASHES_AN_OBSERVER_WAS_OVERRELEASED_OR_SMASHED卡在 KVO_IS_RETAINING_ALL_OBSERVERS_OF_THIS_OBJECT_IF_IT_CRASHES_AN_OBSERVER_WAS_OVERRELEASED_OR_SMASHED
【发布时间】:2018-05-17 10:05:42
【问题描述】:

我正在使用新的 Swift 4 API,并且我以不确定的方式获得了 KVO_IS_RETAINING_ALL_OBSERVERS_OF_THIS_OBJECT_IF_IT_CRASHES_AN_OBSERVER_WAS_OVERRELEASED_OR_SMASHED。有人能够修复它吗?代码非常简单,创建一个 KVO 并将其存储在一个局部变量中。

private var rateObservation: NSKeyValueObservation?

rateObservation = player.observe(\AVQueuePlayer.rate, options: [.initial, .new]) { (_, change) in
   observer(change.newValue)
}

【问题讨论】:

  • 我相信你必须在 main 线程上观察。见:docs。完成后还需要注销观察者。
  • 还要注意rateObservation必须是可选的!
  • rateObservation 是类的实例属性吗?如果它仅在 viewDidLoad 之类的方法中定义,它将在函数完成执行后停止观察。
  • 我展示了我是如何声明它的。请看一看。
  • @PranavKasetti 的建议是我要开始的地方。将 observe() 调用移到 DispatchQueue.main.async {} 块内,看看它是否消失。

标签: ios swift swift4 key-value-observing


【解决方案1】:

答案对我来说没有意义。但这是使它对我有用的唯一方法。

deinit {
    rateObservation?.invalidate()
}

没有意义,因为新观察的文档清楚地表明我们不需要取消注册通知,并且几乎大部分时间都有效,但有时我得到提到的异常并且当我明确地使观察者无效时它永远不会抛出异常。

【讨论】:

  • 没有。文档herehere 明确表示您必须确保在解除分配之前取消注册。您不会收到可重复的错误/异常,但这些是 Apple 准则。
  • 第一个是objective-c doc,另一个是老API。
猜你喜欢
  • 1970-01-01
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 2019-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多