我有一个视图控制器,我试图通过传递一个函数作为块参数来调用Timer.scheduledTimer(withTimeInterval:repeats:block)
,而不是动态创建一个块。我有这个视图控制器:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
Timer.scheduledTimer(withTimeInterval: 5,
repeats: true,
block: onTimer)
}
deinit {
print("deinit \(self)")
}
func onTimer(_ timer: Timer) {
print("Timer did fire")
}
}
呼叫保留视图控制器,因此永远不会释放控制器。
我知道我可以通过以下方式替换呼叫来使其正常工作:
Timer.scheduledTimer(withTimeInterval: 5,
repeats: true) { [weak self] timer in
self?.onTimer(timer)
}
但是我想知道是否有办法直接发送onTimer
方法并避免保留周期。
感谢。
答案 0 :(得分:2)
您应该调用invalidate()方法:
此方法是从RunLoop对象中删除计时器的唯一方法。 RunLoop对象也删除了对计时器的强引用 就在invalidate()方法返回之前或之后的某个时刻。
如果配置了目标和用户信息对象,则为接收者 删除了对这些对象的强引用。
在代码中的某处,您应该实现:
timer.invalidate()
希望这会有所帮助。