我可以在deinit中使用didSet吗?

时间:2018-10-15 16:01:43

标签: swift deinit property-observer

我在类中添加了一个Timer变量,并使用它的didSet观察器使旧值无效

var timer: Timer? {
    didSet { oldValue?.invalidate() }
}

deinit {
    timer = nil
}

我认为这在取消类初始化时足以使计时器无效,但看起来好像没有调用didSet。这是为什么?取消初始化过程中观察者没有工作吗?

1 个答案:

答案 0 :(得分:7)

我们在这里回答一个问题,以便我们可以解决这个问题。

  • 似乎属性观察者显然不在deinit期间运行。这似乎与以下事实类似:财产观察员不在init期间运行,但是与后者不同,前者似乎在任何地方都没有明确记录。

  • 可以通过语义欺骗来解决此问题,但是不要!好像是个错误(我已经归档了)。

  • 最初的用例并不是一个很好的案例。将计时器隐藏在替换音中听起来像是潜在的维修梦night。同意失效和替换就像火腿和鸡蛋一样,我一直做的是编写一个使该序列失效和替换的方法,并通过该方法将所有内容归纳。 (可以在必要时强制执行此操作,但我不会赘述。)可以在deinit期间调用该方法。

补充说明:使用计时器时,请注意内存管理问题!您很容易陷入从未调用deinit的情况,因为您保留了计时器,但计时器保留了您。然后,您将无法使计时器失效,并且整个视图控制器将泄漏。您不必在问题中对此抱怨,但这是一个相关问题,因此我认为最好标记它。