Deinit / Invalidate Timer

时间:2017-02-03 03:53:26

标签: ios swift uinavigationcontroller swift3 nstimer

当用户按下后退按钮时,我试图取消/ 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()
    }
}

当用户按下后退按钮时,它无效。

3 个答案:

答案 0 :(得分:2)

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

我使用的是这个版本,它不会保留自己:

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

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

答案 1 :(得分:1)

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

deinit {
  timer.invalidate()
}

答案 2 :(得分:0)

通过Timer()viewDidAppear viewDidDisappear添加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() }

setInterval