iPhoneの空きメモリがだんだん減って行くのはなぜか?

iOSでは、モバイルデバイスの限られたリソースや操作感を前提に、独自のマルチタスキング環境が実現されています。
ユーザから見たその特徴は、

  • アプリをすばやく切換えられる(Fast app switching)。
  • 再度呼び出した時に、前回の状態が維持されいて、操作を継続できる。

と、いったところが大きいですね。

例えば、

  • メールの中のリンクをタップしてSafariを起動して、Webサイトを見る。
  • また、メールに戻る。
  • もう一度Safariで先程見ていたものを見る。

といった一連の動作をスムーズに行えるようにするような感じです。
でも、ここまではOS3.xでもできていましたよね。

iOS4では、こういう能力を、他の標準アプリや、AppStoreで販売される一般のアプリにも広げたのだと、私は理解しています。

ちなみに、どうやってアプリを終了させるの? という質問ヘの回答は「終了させる必要はない」(スコット)「ユーザがそんなことを考える必要はないはずだ」(ジョブズ)。

iPhone OS 4はマルチタスク対応、バックグラウンドでSkypeも動作 - Engadget Japanese

上記の会話からは、「実際に終了させるべきタイミングは、OSが判断するから気にしなくていいよ。」というメッセージが伝わってきます。
でも現実には、そこまで言えるほど、うまくできあがっていないんじゃないかということを、多くのユーザは感じているのではと思います。

なぜなら、バックグラウンド化に対応したアプリのプロセスは、特定の制御条件に達するまで、終了されずに溜まって行くので、普通に使っていると、だんだん空きメモリが減って行くからです。
あと、連続使用している時間の長さとは、基本的に相関関係はなく、使い方によるところが大きいということになります。
当たり前と言えば、当たり前のことですが。。

ユーザが不満を感じるところは。。?

iOSは、アクティブなアプリが何かしようとしたタイミングで、空きメモリが足りないと判断された場合に、バックグラウンドで一時停止状態になっているアプリケーションプロセスの中で、終了させてもいいと判定されたものを強制終了するといった制御をしています。

id:paellaさんからいただいたコメント(空きメモリが少ない時に、iPhoneの中で何が起きるのか、また調べてみました。 - The iPhone Development Playground) にて、終了させてもいいという判定基準は、以下の通りとなっていることがわかりました。*1

WWDC2010のスライドで、バックグラウンドのアプリが殺される優先度として
1) 多量のメモリを使用しているSuspended状態のアプリケーション
2) 多量のメモリを使用しているRunning状態のアプリケーション
3) Suspended状態のアプリケーション
4) Running状態のアプリケーション
と記述されていますね。

この制御が、本当に空きメモリが足りなくなった時に初めて行われるという点が、ユーザに「もっさり感」を与え、不満を感じさせる原因かもしれません。

ユーザの判断で終了させたい時は、マルチタスキングバー(最近使ったアプリケーションのアイコンリスト)*2から、対象のものを選択して削除することができるのは、多くの方がご存知ですね。でも、そこにあるものがすべてバックグラウンドに存在しているとは限らないところが、残念です。そういうものを削除しても全く効果はありませんので。。

不要なプロセスは自分で選んで終了させよう - The iPhone Development Playground

PCであれば、ユーザがアプリをバックグラウンドで活かしておくか、終了させるのかを簡単に選択することができますが、iOSではちょっと面倒な操作と判断が必要です。
そこで、iPhone4になった今も、多くのユーザが、「空きメモリが足りないと判断される状況」を、自発的に作り出す「メモリ解放機能」を持ったアプリを求めるのかなと思っています。

解決するためには。。?

マルチタスキングバーで、バックグラウンドプロセスとして、存在してるかどうかを見えるようにしてくれることが、最良の解決策だと私は思います。ついでに、各プロセスのメモリ使用量が見えるようにしてくれればさらにありがたいですね。
でも、現時点ではAppleの方針とは合わないと思われるので、実現はむずかしいかもです。

では、視点を変えて、アプリ開発者側に、何かできることはあるでしょうか?

アプリの要件として、バックグラウンドで待機する必要ないのであれば、バックグラウンド化はさせないようにすることで、一定の抑止効果は得られると思います。
SysStats Monitorの場合、操作の継続性がなく、バックグラウンド化することに意味が無いので、しない設定にしています。
反対に、写真を編集するようなアプリは、編集途中で電話をうけた場合などに備えて、バックグラウンド化に対応しておくべきでしょう。

この設定はアプリ単位の静的なプロパティであり、動的に切換えることはできないので、簡単には決めにくいかもしれませんね。
(デフォルトはバックグラウンド化する設定になっているので、注意が必要ですね)

Out Of Memory Killerに似てるけど、もう少しやさしいiPhoneOSの空きメモリー制御 - The iPhone Development Playground

ということで、決定的な解決策はありませんが、まずは、現状に納得することも大事なのではと思います。

*1:"Session 105 - Adopting Multitasking on iPhone OS, Part 1"の25ページ

*2:先日(9/1)に行われたiOS4.2発表時のプレゼンで、Steve Jobs氏が "multitasking bar" と言っていたので、今後はこの用語も使用しようと思います。