【Swift】Timer.invalidateとは?使い方や活用シーン、注意点をわかりやすく解説!

一定間隔で処理を繰り返すタイマー(Timer)はとても便利ですが、不要になったら止めないとリソースの無駄や予期しないバグにつながることがあります。

そんなときに使うのが .invalidate() メソッドです。

この記事では、Timer.invalidate() の基本的な使い方や動作、どんな場面で必要になるのか、わかりやすく解説します。

Timer.invalidateとは?

invalidate() は、稼働中の Timer を手動で停止するためのメソッドです。

Swiftでは Timer.scheduledTimer(...) などでタイマーを開始すると、そのタイマーは指定した間隔で繰り返し動作し続けます。

.invalidate() を呼び出すことで不要になったタイマーを終了することができるんです。

ただし、.invalidate()によって一度無効化されたタイマーは再度使うことはできません。

基本の使い方

タイマーを止めたい場面では、まず Timer のインスタンスを変数で保持し、タイマーをスタートさせます。

その後、必要なタイミングで .invalidate() を呼んでタイマーを止めます。

上記のように、start 関数でタイマーを開始し、stop 関数で明示的に停止する構成にすると管理がしやすくなります。

具体例:ストップボタンでタイマーを停止する

ユーザー操作で明示的にタイマーを開始したり、停止したりしたい場合は、ボタンと組み合わせることができます。

これにより、ユーザーが「スタート」を押したときにカウントアップが始まり、「ストップ」を押すと.invalidate()が呼び出され、タイマーが停止します。

Timer.invalidate

活用シーンと注意点

invalidate() は「タイマーを明示的に止めるためのスイッチ」です。

タイマーは自動で止まることがないため、アプリの状態やユーザーの操作に応じて 「ここで止めるべき」 という判断を入れることが重要になります。

特に以下のような場面では、invalidate() を呼ぶことが必須になります。

  • カウントダウン中にユーザーがキャンセル操作をした場合
    → たとえば試験アプリやトレーニングアプリで「キャンセル」ボタンを押したら、その時点でタイマーを終了する必要があります。
  • Viewが破棄されるとき(onDisappear で呼ぶ)
    → SwiftUIでは画面が閉じられてもタイマーが動き続けると、不具合や不要な処理の原因になります。onDisappearで停止するのがベストです。
  • アプリがバックグラウンドに移行する際にタイマーを一時停止したいとき
    → アプリが閉じている間に処理を走らせても意味がなく、バッテリー消費も増えるため、バックグラウンドでは一旦止めるのが安全です。
  • 条件を満たしたらタイマーを終了したいとき(例:一定回数で終了)
    → 例えば「5回処理したら終了」といった条件で停止させるケースです。必要以上に処理を走らせないための重要な使い方です。

止め忘れはメモリリークや無限ループにつながるため、アプリを安定して動かすためにも invalidate() の呼び出しを忘れないようにしましょう。

まとめ

Timer.invalidate() は、Timer を停止して無効化するための重要なメソッドです。

  • タイマーは明示的に止めないと永遠に動き続ける
  • 必要なくなったら .invalidate() で停止する
  • SwiftUIでは View のライフサイクルとセットで使うのが安全
  • 無効化したタイマーは再利用できない点に注意

タイマーを適切に止めることで、バッテリーの無駄な消費やメモリリークを防ぎ、安定したアプリ運用につながります。

ぜひアプリでタイマーを使う際には、invalidate() の記述を忘れずに意識しましょう!

おすすめの記事