IPhone OSデバイスでのメモリ管理のブラックアートについて:異なるレベルのメモリ警告はどういう意味ですか。レベル1?レベル2?ダイヤルは11になりますか?
コンテキスト:長時間のメモリストレステスト期間の後、iPod音楽プレーヤーアプリの再生中にiPadアプリを実行することを含め、私は受け取ったランダムであるがまれなメモリ警告を無視する傾向があります。私のアプリneverクラッシュします。今まで。私のアプリはリークフリーです。そして、まあ、MEMSの警告は重要ではないようです。
おかげで、
ダグ
基本的に、警告はdeviceのメモリが不足しており、「メモリを解放していただければ積極的に使用していない」ことを意味します。 d be swell! "。メモリ管理が厳しく、実際に破棄できるオブジェクトがない場合は、メッセージを渡すだけで無視します。
メモリレベルの警告は、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は、各メモリレベルで以下を実行するように構成されています。
アクティブなアプリ(jetsam)の強制終了は、SpringBoardでは処理されませんが、launchd
によって処理されます。
/*
** Threshold values for notifications
*/
typedef enum {
OSMemoryNotificationLevelAny = -1,
OSMemoryNotificationLevelNormal = 0,
OSMemoryNotificationLevelWarning = 1,
OSMemoryNotificationLevelUrgent = 2,
OSMemoryNotificationLevelCritical = 3
} OSMemoryNotificationLevel;
合計5レベルのメモリ警告(-1,3)。
メモリレベルの警告の説明に関しては、@ KennyTMの答えは素晴らしいです。
PMなどに役立つ複数の関連ポイントを追加したいと思います。
メモリレベル警告が発生した場合はどうすればよいですか?
これらの警告のいずれかを受信すると、ハンドラーメソッドは、不要なメモリをすぐに解放して応答する必要があります。たとえば、UIViewControllerクラスのデフォルトの動作は、そのビューが現在表示されていない場合、そのビューをパージすることです。サブクラスは、追加のデータ構造を削除することでデフォルトの動作を補完できます。画像のキャッシュを保持するアプリは、現在画面上にない画像をリリースすることで応答する場合があります。
メモリレベルの警告を観察する方法は?
システムがメモリ不足の警告をアプリに送信したら、すぐに応答します。 iOSは、空きメモリの量が安全なしきい値を下回ると、実行中のすべてのアプリに通知します。 (一時停止中のアプリには通知しません。)アプリがこの警告を受け取った場合、できるだけ多くのメモリを解放する必要があります。これを行う最適な方法は、キャッシュ、イメージオブジェクト、および後で再作成できる他のデータオブジェクトへの強い参照を削除することです。
UIKitには、次のようなメモリ不足の警告を受け取るいくつかの方法があります。
アプリのメモリフットプリントを削減する方法は?
メモリを賢く割り当てる方法は?