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 / 无效定时器的主要内容,如果未能解决你的问题,请参考以下文章