web-dev-qa-db-ja.com

iPhone OSのメモリ警告。異なるレベルは何を意味しますか?

IPhone OSデバイスでのメモリ管理のブラックアートについて:異なるレベルのメモリ警告はどういう意味ですか。レベル1?レベル2?ダイヤルは11になりますか?

コンテキスト:長時間のメモリストレステスト期間の後、iPod音楽プレーヤーアプリの再生中にiPadアプリを実行することを含め、私は受け取ったランダムであるがまれなメモリ警告を無視する傾向があります。私のアプリneverクラッシュします。今まで。私のアプリはリークフリーです。そして、まあ、MEMSの警告は重要ではないようです。

おかげで、
ダグ

85
dugla

基本的に、警告はdeviceのメモリが不足しており、「メモリを解放していただければ積極的に使用していない」ことを意味します。 d be swell! "。メモリ管理が厳しく、実際に破棄できるオブジェクトがない場合は、メッセージを渡すだけで無視します。

97

メモリレベルの警告は、SpringBoardによってログに記録されます。アプリ開発者は、気にする必要はありません。 _-{application}didReceiveMemoryWarning_に応答するだけで十分です。


警告には4つのレベルがあります(0〜3)。これらはカーネルメモリウォッチャーから設定され、 not-so-public function OSMemoryNotificationCurrentLevel() で取得できます。

_typedef enum {
    OSMemoryNotificationLevelAny      = -1,
    OSMemoryNotificationLevelNormal   =  0,
    OSMemoryNotificationLevelWarning  =  1,
    OSMemoryNotificationLevelUrgent   =  2,
    OSMemoryNotificationLevelCritical =  3
} OSMemoryNotificationLevel;
_

レベルのトリガー方法は文書化されていません。 SpringBoardは、各メモリレベルで以下を実行するように構成されています。

  1. 警告(非正常)—不要なバックグラウンドアプリの自動再起動を再起動または遅延します。郵便物。
  2. 緊急—すべてのバックグラウンドアプリを終了します。 SafariおよびiPod。
  3. クリティカル以上—カーネルが引き継ぎ、おそらくSpringBoardを強制終了するか、再起動することさえあります。

アクティブなアプリ(jetsam)の強制終了は、SpringBoardでは処理されませんが、launchdによって処理されます。

193
kennytm

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を受信します。

アプリのメモリフットプリントを削減する方法は?

  • メモリリークを排除します。
  • リソースファイルをできるだけ小さくします。
  • 大規模なデータセットにはCore DataまたはSQLiteを使用します。
  • リソースを遅延的にロードします。
  • Thumbオプションを使用してプログラムをビルドします。

詳細は http://developer.Apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html


メモリを賢く割り当てる方法は?

  • 自動解放されたオブジェクトの使用を減らす:自動参照カウント(ARC)を使用すると、オブジェクトを割り当て/初期化し、適切なタイミングでコンパイラーがそれらを解放できるようにすることをお勧めします。これは、現在のメソッドのスコープを超えて生きることを防ぐために過去に自動リリースされた一時オブジェクトにも当てはまります。
  • リソースのサイズ制限を課す:小さいリソースファイルが実行するときに大きなリソースファイルをロードしないようにします。高解像度の画像を使用する代わりに、iOSベースのデバイスに適したサイズの画像を使用してください。大きなリソースファイルを使用する必要がある場合は、ファイルの必要な部分だけをいつでもロードする方法を見つけてください。たとえば、ファイル全体をメモリにロードするのではなく、mmapおよびmunmap関数を使用して、ファイルの一部をメモリにマップしたり、メモリからマップしたりします。ファイルのメモリへのマッピングの詳細については。
  • 無制限の問題セットを避ける:無制限の問題セットでは、計算するために任意の大量のデータが必要になる場合があります。セットが使用可能なメモリより多くのメモリを必要とする場合、アプリは計算を完了できない可能性があります。アプリは、このようなセットを可能な限り回避し、既知のメモリ制限の問題に取り組む必要があります。
12