首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Deinit /失效计时器

Deinit /失效计时器
EN

Stack Overflow用户
提问于 2017-02-03 03:53:26
回答 2查看 5.7K关注 0票数 6

当用户按下后退按钮时,我试图删除/使Timer失效,而不是当他按下一个ViewController时。

代码语言:javascript
复制
var timer = Timer()
                timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(timePrinter), userInfo: nil, repeats: true)
                timer.fire()

override func viewWillDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    if self.isMovingFromParentViewController{
        timer.invalidate()
    }
}

当用户按下后退按钮时,它不起作用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-10 01:33:59

当您使用带有“目标/选择器”的预定计时器时,它将保留其目标。更具体地说,Runloop保留预定的定时器,而这些定时器又保留了它们的目标。

我使用这个版本,它不保留self:

代码语言:javascript
复制
Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { [weak self] _ in
    self?.doSomethingRegularly()
})

您还需要在deinit中使上述计时器失效,否则会泄漏计时器(但不会泄漏您的类)。

票数 17
EN

Stack Overflow用户

发布于 2017-02-03 04:25:28

不要在viewWillDisappear(_:)中使计时器失效。创建一个deinit方法并将其放在那里。当您按后退按钮时,应该释放当前的视图控制器,deinit方法将触发。

代码语言:javascript
复制
deinit {
  timer.invalidate()
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42016480

复制
相关文章

相似问题

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