[英]Deinit / Invalidate Timer
我試圖在用戶按下后退按鈕時取消/使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()
}
}
當用戶按下后退按鈕時它不起作用。
當您將排定計時器與“目標/選擇器”一起使用時,它將保留其目標。 更具體地說,Runloop保留計划的計時器,這些計時器又保留其目標。
我使用此版本,該版本不保留自身:
Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { [weak self] _ in
self?.doSomethingRegularly()
})
而且您仍然需要在deinit中使上述計時器無效,否則您將泄漏計時器(但不會泄漏您的班級)。
不要將計時器失效放在viewWillDisappear(_:)
。 創建一個deinit方法並將其放在那里。 當您按下返回按鈕時,應釋放當前的視圖控制器,並且將觸發deinit方法。
deinit {
timer.invalidate()
}
通過在viewDidAppear
和viewDidDisappear
添加Timer()
來修復它,我正在執行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()
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.