Deinit / 无效定时器

Deinit / Invalidate Timer

我正在尝试 deinit/invalidate 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()
    }
}

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

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

deinit {
  timer.invalidate()
}

当您使用带有 'target/selector' 的预定计时器时,它会保留其目标。更具体地说,Runloop 保留预定的计时器,而计时器又保留它们的目标。

我用的是这个版本,不保留自我:

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

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