読者です 読者をやめる 読者になる 読者になる

A Day In The Life

とあるプログラマの備忘録

マルチタスキング対応後のアプリのイベントフローをまとめてみた

iphone objective-c/objc ios

iOS 5の登場でこの記事の内容は古くなりました。最新の情報は以下の記事をご覧ください。

iOS4で導入されたマルチタスキングですが便利な反面イベントの発生順序が大幅に変更され複雑化しました。イベントの発生順序をきちんと把握しておかないと思わぬところでメモリを食ったりバッテリに負担をかけてしまうのでまとめてみました。
下図で色の変わっているメソッドiOS4で追加されたメソッドです。
UIApplicationDelegate,UIViewController,applicationWillEnterForeground,applicationDidBecomeActive,applicationWillResignActive,applicationDidEnterBackground

2010/7/1:図を修正

deallocメソッドを削除しました。アプリ終了時UIApplicationDelegateのdeallocメソッドは呼び出されません。システム側でリークも含めてメモリ領域を解放してくれます。paellaさんご指摘ありがとうございました。
applicationWillResignActive,applicationDidBecomeActiveメソッドはOS2.0で追加されたメソッドだったので色を修正しました。aritomさんご指摘ありがとうございました。

図の補足

主なメソッドの説明です。

  • applicationWillResignActive:
    アプリケーションがアクティブでなくなる直前に呼ばれる
  • applicationDidEnterBackground:
    アプリケーションがバックグラウンドになったら呼ばれる
  • applicationWillEnterForeground:
    アプリケーションがバックグラウンドから復帰する直前に呼ばれる
  • applicationDidBecomeActive:
    アプリケーションがアクティブになったら呼ばれる
  • applicationWillTerminate
    バックグラウンド実行中にアプリが終了された場合に呼ばれます。ただしアプリがサスペンド状態の場合アプリを終了してもこのメソッドは呼ばれません。

ポイントはアプリがバックグラウンド実行になるタイミング(applicationDidEnterBackground)でUIViewControllerのviewWillDisappearやviewDidDisappearメソッドが呼ばれないのと、アプリの前面復帰時(applicationWillEnterForeground)にUIViewControllerのviewWillAppearやviewDidAppearメソッドが呼ばれないことです。viewWillDisappearメソッド等でデータの保存なんかをしている場合はタイミングを見直した方が良さそうです。

メモリ警告メソッドの呼び出しタイミング

バックグラウンド実行中に別の前面実行アプリでメモリ警告(Received memory warning. Level=1)が発生した場合、次回アプリ起動時にUIApplicationDelegate#applicationDidReceiveMemoryWarningメソッドが呼ばれます。メモリ警告レベル1が1度出たぐらいではバックグラウンドのアプリが即座に殺されることはないようです。さすがにメモリ警告レベル2を3回ぐらい出してみたら速攻で殺されました。
アプリ起動時にapplicationDidReceiveMemoryWarningメソッドが呼ばれる流れは以下のようになります。
メモリ警告時の流れ

図の補足

マルチタスキング(図中ではMTと略)対応アプリと非対応アプリの場合で少し流れが変わります。非対応アプリでメモリ警告が起こってもアプリ終了時に全てのメモリが解放されるのでよっぽどのことがない限りバックグラウンドで動いているアプリに影響を与えることはありません。一方マルチタスキング対応のアプリの場合、メモリ警告後ホームボタンを押してもメモリ領域が解放されるわけではないので他のアプリに影響を与える確率が高くなります。メモリ警告時の処理を怠ると他のアプリに迷惑をかける確率が高くなるので注意が必要です。

関連記事

iOS 5でイベントメソッドの呼び出し順が変更されました。詳しくは以下の記事を参照性ください。