繁体   English   中英

Deinit / Invalidate Timer

[英]Deinit / Invalidate Timer

我试图在用户按下后退按钮时取消/使Timer无效,但在他推到下一个 ViewController 时却没有。

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()
    }
}

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

当您将排定计时器与“目标/选择器”一起使用时,它将保留其目标。 更具体地说,Runloop保留计划的计时器,这些计时器又保留其目标。

我使用此版本,该版本不保留自身:

Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { [weak self] _ in
    self?.doSomethingRegularly()
})

而且您仍然需要在deinit中使上述计时器无效,否则您将泄漏计时器(但不会泄漏您的班级)。

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

deinit {
  timer.invalidate()
}

通过在viewDidAppearviewDidDisappear添加Timer()来修复它,我正在执行timer.invalidate()

override func viewDidAppear(_ animated: Bool) {
    if setTimer == true{
        timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(timePrinter), userInfo: nil, repeats: true)
        timer.fire()
    }
}

override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
        timer.invalidate()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM