首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我能用didSet吗?

我能用didSet吗?
EN

Stack Overflow用户
提问于 2018-10-15 16:01:42
回答 1查看 655关注 0票数 11

我向类中添加了一个计时器变量,并使用它的didSet观察者使旧值无效。

代码语言:javascript
复制
var timer: Timer? {
    didSet { oldValue?.invalidate() }
}

deinit {
    timer = nil
}

我认为当类被重新初始化时,这就足以使计时器失效,但是看起来没有调用didSet。为什么会这样呢?观察者在去初始化期间不工作吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-15 18:08:31

让我们把答案放在这里,这样我们就可以结束这个问题了。

  • 似乎在deinit期间,属性观察者显然没有运行。这似乎与属性观察者在init期间不运行的事实类似,但与后者不同的是,前者似乎在任何地方都没有明确的文档记录。
  • 您可以通过语义欺骗来解决这个问题,但是不要!这似乎是个bug (我已经归档了)。
  • 最初的用例并不是一个很好的案例。在替换中隐藏计时器失效听起来像是潜在的维护噩梦。一致认为失效和替换就像火腿和鸡蛋一样,我一直做的就是写一个方法,按照这个顺序,使所有的东西失效和替换,并通过那个方法把所有的东西都漏斗。(如果有必要,可以强制执行,但我不打算谈这个问题。)可以在deinit期间调用该方法。

补充说明:当使用计时器时,注意内存管理问题!您可以轻松地让自己陷入从未被调用过deinit的情况,因为您保留了计时器,但定时器却在保留您。然后,您将无法使计时器失效,您的整个视图控制器将泄漏。你的问题中没有抱怨这一点,但这是一个相关的问题,所以我想我最好提醒它。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52820629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档