简体   繁体   English

Deinit / Invalidate Timer

[英]Deinit / Invalidate Timer

I'm trying to deinit/invalidate Timer when user press back button but not when he push to next ViewController.我试图在用户按下后退按钮时取消/使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()
    }
}

It is not working when user press back button.当用户按下后退按钮时它不起作用。

When you use a scheduled timer with 'target/selector', it retains its target. 当您将排定计时器与“目标/选择器”一起使用时,它将保留其目标。 More specifically, the Runloop retains scheduled timers, in turn which retain their target. 更具体地说,Runloop保留计划的计时器,这些计时器又保留其目标。

I use this version, which doesn't retain self: 我使用此版本,该版本不保留自身:

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

And you'll still need to invalidate the above timer in your deinit as well, otherwise you'll leak the timer (but not your class). 而且您仍然需要在deinit中使上述计时器无效,否则您将泄漏计时器(但不会泄漏您的班级)。

Don't put the timer invalidate in viewWillDisappear(_:) . 不要将计时器失效放在viewWillDisappear(_:) Create a deinit method and put it there. 创建一个deinit方法并将其放在那里。 When you press the back button the current view controller should be released and the deinit method will fire. 当您按下返回按钮时,应释放当前的视图控制器,并且将触发deinit方法。

deinit {
  timer.invalidate()
}

Fixed it by adding Timer() in viewDidAppear and on viewDidDisappear I'm doing 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