Swift4でのTimer処理関連を調べたメモ
メモリー解放に気をつける
まずはTimer処理
final class ViewController { private var timer: Timer? // Timerを保持する変数 private(set) var timerTotalDuration: TimeInterval = 0 // 総秒数を保持する変数 func startTimer() { // ⑤ Timer のスケジューリング重複を回避 guard timer == nil else { return } // ① Timerのスケジューリングと保持 timer = Timer.scheduledTimer( timeInterval: 5, target: self, selector: #selector(handleTimer(_:)), userInfo: nil, repeats: true ) } func stopTimer() { // ③ Timer のスケジューリングを破棄 timer?.invalidate() } func resetTimer() { // ④ Timer のスケジューリングを破棄し、総秒数を0に戻す stopTimer() timerTotalDuration = 0 } @objc private func handleTimer(_ timer: Timer) { // ② Timer の間隔秒を総秒数に加算する timerTotalDuration += timer.timeInterval print("timer fired. total: \(timerTotalDuration)") } }
View破棄時にTimerのメモリを解放する
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) stopTimer() }
参考記事
【Swift】加算型Timer(ストップウォッチみたいな)の作り方 〜Timerの基本的な使い方〜 - Qiita
【Swift】メモリー対策!使ったタイマーは必ずinvalidate() - Qiita
【Swift】Timerの強参照が破棄できない時の対処法(deinit での破棄方法)│RC-Code