我可以在deinit中使用didSet吗?

Dam*_*ycz 11 swift deinit property-observer

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

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

deinit {
    timer = nil
}
Run Code Online (Sandbox Code Playgroud)

我认为这样就足以在类被取消初始化时使计时器无效,但看起来似乎没有调用didSet.这是为什么?观察员在去初始化期间不工作吗?

mat*_*att 8

让我们在这里回答,这样我们就可以解决这个问题。

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

  • 可以通过语义技巧解决此问题,但是不要!那似乎是一个错误(我已经归档了)。

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

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