Deinit / 无效定时器

Posted

技术标签:

【中文标题】Deinit / 无效定时器【英文标题】:Deinit / Invalidate Timer 【发布时间】:2017-02-03 03:53:26 【问题描述】:

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

当用户按下返回按钮时它不起作用。

【问题讨论】:

如果有其他方法请告诉我。 您是否验证过调用了`timer.invalidate()`? 请大家帮帮我。还是有这个问题 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

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

deinit 
  timer.invalidate()

【讨论】:

@Nitesh,如果deinit() 没有被解雇,那么你的vc 没有被释放,这意味着你对它有很强的引用。检查您的代码,尤其是闭包(确保在闭包中使用对 vc 的弱引用)。 当我注释掉 Timer() 时 deinit 会被调用,但不会被 Timer 调用 @Nitesh 在“viewwillDisapper”方法中设置计时器值为零 @NidhiPatel 然后这将在用户转到下一页时完成。那时我不想让它为零。只有当用户点击返回按钮时它才应该是 nil。 简单地使deinit 中的时间无效可能行不通。计时器在运行时保留其目标,因此不会释放视图控制器并且不会调用 deinit。

以上是关于Deinit / 无效定时器的主要内容,如果未能解决你的问题,请参考以下文章

emwin定时器重启无效

STM32 通用T2T3T4T5定时器详解

使多次创建的计时器无效

电脑输入的定时关机命令为啥无效

使属于 UIView 子类的计时器无效

SwiftUI:在设备方向上重绘会使计时器无效