OSMemoryNotification.hから、
/*
** Threshold values for notifications
*/
typedef enum {
OSMemoryNotificationLevelAny = -1,
OSMemoryNotificationLevelNormal = 0,
OSMemoryNotificationLevelWarning = 1,
OSMemoryNotificationLevelUrgent = 2,
OSMemoryNotificationLevelCritical = 3
} OSMemoryNotificationLevel;
合計5レベルのメモリ警告(-1,3)。
メモリレベルの警告の説明に関しては、@ KennyTMの答えは優れています。
PMや他の人に役立つかもしれないいくつかの関連するポイントを追加したいと思います。
メモリレベルの警告がある場合はどうすればよいですか?
これらの警告のいずれかを受信すると、ハンドラメソッドは不要なメモリをすぐに解放することで応答する必要があります。たとえば、UIViewControllerクラスのデフォルトの動作は、ビューが現在表示されていない場合、そのビューをパージすることです。サブクラスは、追加のデータ構造をパージすることにより、デフォルトの動作を補足できます。画像のキャッシュを維持するアプリは、現在画面に表示されていない画像を解放することで応答する場合があります。
メモリレベルの警告を監視する方法は?
から http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html
システムがアプリにメモリ不足の警告を送信したら、すぐに応答します。iOSは、空きメモリの量が安全なしきい値を下回ると、実行中のすべてのアプリに通知します。(中断されたアプリには通知されません。)アプリがこの警告を受け取った場合は、できるだけ多くのメモリを解放する必要があります。これを行う最良の方法は、キャッシュ、イメージオブジェクト、および後で再作成できるその他のデータオブジェクトへの強力な参照を削除することです。
UIKitは、以下を含む、メモリ不足の警告を受け取るいくつかの方法を提供します。
- アプリデリゲートのapplicationDidReceiveMemoryWarning:メソッドを実装します。
- カスタムUIViewControllerサブクラスのdidReceiveMemoryWarningメソッドをオーバーライドします。
- UIApplicationDidReceiveMemoryWarningNotificationnotificationを受信するために登録します。
アプリのメモリフットプリントを減らす方法は?
- メモリリークを排除します。
- リソースファイルをできるだけ小さくします。
- 大規模なデータセットにはCoreDataまたはSQLiteを使用します。
- リソースを遅延ロードします。
- Thumbオプションを使用してプログラムをビルドします。
詳細については、http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.htmlをご覧ください。
賢くメモリを割り当てる方法は?
- 自動解放されたオブジェクトの使用を減らす:自動参照カウント(ARC)を使用すると、オブジェクトを割り当て/初期化して、適切なタイミングでコンパイラーに解放させることをお勧めします。これは、過去に自動解放して現在のメソッドの範囲を超えて存続するのを防ぐことができた一時オブジェクトにも当てはまります。
- リソースにサイズ制限を課す:小さいリソースファイルでな場合は、大きいリソースファイルをロードしないでください。高解像度の画像を使用する代わりに、iOSベースのデバイスに適したサイズの画像を使用してください。大きなリソースファイルを使用する必要がある場合は、いつでも必要なファイルの部分のみをロードする方法を見つけてください。たとえば、ファイル全体をメモリにロードするのではなく、mmap関数とmunmap関数を使用して、ファイルの一部をメモリにマップしたり、メモリからマップしたりします。ファイルをメモリにマッピングする方法の詳細については。
- 無制限の問題セットを回避する:無制限の問題セットは、計算するために任意の量のデータを必要とする場合があります。セットに使用可能なメモリよりも多くのメモリが必要な場合、アプリは計算を完了できない可能性があります。アプリは可能な限りそのようなセットを避け、既知のメモリ制限の問題に対処する必要があります。