我在我的类中添加了一个 Timer 变量,并使用它的 didSet 观察者使旧值无效
var timer: Timer? {
didSet { oldValue?.invalidate() }
}
deinit {
timer = nil
}
我认为这足以在类被取消初始化时使计时器无效,但看起来没有调用 didSet。这是为什么?观察者在反初始化期间不工作吗?
我在我的类中添加了一个 Timer 变量,并使用它的 didSet 观察者使旧值无效
var timer: Timer? {
didSet { oldValue?.invalidate() }
}
deinit {
timer = nil
}
我认为这足以在类被取消初始化时使计时器无效,但看起来没有调用 didSet。这是为什么?观察者在反初始化期间不工作吗?
让我们在这里给出一个答案,这样我们就可以关闭它。
似乎财产观察员显然不在deinit
. 这似乎与属性观察者不在 期间运行的事实平行init
,但与后者不同的是,前者似乎在任何地方都没有明确记录。
您可以通过语义技巧来解决此问题,但不要!这似乎是一个错误(我已经提交了它)。
最初的用例一开始并不是一个很好的用例。在替换中隐藏计时器的失效听起来像是潜在的维护噩梦。同意失效和替换就像火腿和鸡蛋一样,我一直在做的就是编写一个方法,按顺序使失效和替换,并通过该方法汇集所有内容。(如有必要,可以强制执行,但我不会深入讨论。)该方法可以在deinit
.
补充说明:使用计时器时,请注意内存管理问题!你可以很容易地让自己陷入一种永远不会被召唤的境地deinit
,因为你保留了计时器,而计时器却保留了你。然后,您将无法使计时器无效,并且您的整个视图控制器将泄漏。你不会在你的问题中抱怨这一点,但这是一个相关的问题,所以我想我最好把它标记出来。