
一定間隔で処理を繰り返すタイマー(Timer
)はとても便利ですが、不要になったら止めないとリソースの無駄や予期しないバグにつながることがあります。
そんなときに使うのが .invalidate()
メソッドです。
この記事では、Timer.invalidate()
の基本的な使い方や動作、どんな場面で必要になるのか、わかりやすく解説します。
Timer.invalidateとは?
invalidate()
は、稼働中の Timer
を手動で停止するためのメソッドです。
Swiftでは Timer.scheduledTimer(...)
などでタイマーを開始すると、そのタイマーは指定した間隔で繰り返し動作し続けます。
.invalidate()
を呼び出すことで不要になったタイマーを終了することができるんです。
ただし、.invalidate()
によって一度無効化されたタイマーは再度使うことはできません。
基本の使い方
タイマーを止めたい場面では、まず Timer
のインスタンスを変数で保持し、タイマーをスタートさせます。
その後、必要なタイミングで .invalidate()
を呼んでタイマーを止めます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var timer: Timer? func startTimer() { timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in print("1秒ごとの処理") } } func stopTimer() { timer?.invalidate() timer = nil } |
上記のように、start
関数でタイマーを開始し、stop
関数で明示的に停止する構成にすると管理がしやすくなります。
具体例:ストップボタンでタイマーを停止する
ユーザー操作で明示的にタイマーを開始したり、停止したりしたい場合は、ボタンと組み合わせることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import SwiftUI struct ContentView: View { @State private var counter = 0 @State private var timer: Timer? var body: some View { VStack(spacing: 20) { Text("カウント: \(counter)") .font(.title) Button("スタート") { timer?.invalidate() // 既存のタイマーを止める(多重起動防止) timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in counter += 1 } } Button("ストップ") { timer?.invalidate() } } .padding() } } |
これにより、ユーザーが「スタート」を押したときにカウントアップが始まり、「ストップ」を押すと.invalidate()
が呼び出され、タイマーが停止します。
活用シーンと注意点
invalidate()
は「タイマーを明示的に止めるためのスイッチ」です。
タイマーは自動で止まることがないため、アプリの状態やユーザーの操作に応じて 「ここで止めるべき」 という判断を入れることが重要になります。
特に以下のような場面では、invalidate()
を呼ぶことが必須になります。
- カウントダウン中にユーザーがキャンセル操作をした場合
→ たとえば試験アプリやトレーニングアプリで「キャンセル」ボタンを押したら、その時点でタイマーを終了する必要があります。 - Viewが破棄されるとき(onDisappear で呼ぶ)
→ SwiftUIでは画面が閉じられてもタイマーが動き続けると、不具合や不要な処理の原因になります。onDisappear
で停止するのがベストです。 - アプリがバックグラウンドに移行する際にタイマーを一時停止したいとき
→ アプリが閉じている間に処理を走らせても意味がなく、バッテリー消費も増えるため、バックグラウンドでは一旦止めるのが安全です。 - 条件を満たしたらタイマーを終了したいとき(例:一定回数で終了)
→ 例えば「5回処理したら終了」といった条件で停止させるケースです。必要以上に処理を走らせないための重要な使い方です。
止め忘れはメモリリークや無限ループにつながるため、アプリを安定して動かすためにも invalidate()
の呼び出しを忘れないようにしましょう。
まとめ
Timer.invalidate()
は、Timer
を停止して無効化するための重要なメソッドです。
- タイマーは明示的に止めないと永遠に動き続ける
- 必要なくなったら
.invalidate()
で停止する - SwiftUIでは
View
のライフサイクルとセットで使うのが安全 - 無効化したタイマーは再利用できない点に注意
タイマーを適切に止めることで、バッテリーの無駄な消費やメモリリークを防ぎ、安定したアプリ運用につながります。
ぜひアプリでタイマーを使う際には、invalidate()
の記述を忘れずに意識しましょう!