iPhoneOSのメモリ警告。異なるレベルはどういう意味ですか?


85

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

コンテキスト:iPodミュージックプレーヤーアプリを再生しながらiPadアプリを実行するなど、広範なメモリストレステスト期間の後、私は受け取ったランダムでありながらまれなメモリ警告を無視する傾向があります。私のアプリは決してクラッシュしません。これまで。私のアプリはリークフリーです。そして、まあ、MEMSの警告は問題ではないようです。

ありがとう、
ダグ

回答:


98

基本的に、警告は、デバイスのメモリが不足していること、および「アクティブに使用していないメモリを解放していただければ、うねりになる」ことを意味します。メモリ管理が厳しく、実際に破棄できるオブジェクトがない場合は、メッセージを渡して無視してください。


25
笑「積極的に使っていないメモリを解放していただければうねりだよ!」
貴重な

15
あなたはiPhoneOSのモグラたたきの記憶ダンスのグリスリしたベテランのように聞こえます。
dugla 2010年

193

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


警告には4つのレベル(0から3)があります。これらはカーネルメモリウォッチャーから設定され、それほど公開OSMemoryNotificationCurrentLevel()されていない関数によって取得できます。

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

レベルがどのようにトリガーされるかは文書化されていません。SpringBoardは、各メモリレベルで次のことを行うように構成されています。

  1. 警告(通常ではありません)—メールなどの不要なバックグラウンドアプリの再起動または自動再起動を遅らせます。
  2. 緊急— SafariやiPodなど、すべてのバックグラウンドアプリを終了します。
  3. クリティカル以上—カーネルが引き継ぎ、おそらくSpringBoardを強制終了するか、再起動します。

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


これをありがとう。この質問については、あなたとコメディアンのウィリハムとの間のトスでした。ユーモアが勝ちます。乾杯。
dugla 2010年

こんにちは、私は同じ問題を抱えています。アプリケーションを5回以上継続して実行した後、Receivedmemoryの警告が表示されます。レベル= 1で20回ですが、アプリケーションはクラッシュしていません。しかし、このメッセージが表示されると、メモリ警告を受信しました。Level = 2アプリケーションがクラッシュしています。レベル2は、レベル1が20回近く表示された後に表示されます。アプリケーションがクラッシュしないようにするにはどうすればよいですか。ありがとう
srikanth rongali 2010年

1
@ケニー:メモリが少ないということは、最大でどれだけ使用できるかということです。ライブバイトをいくら持つことができますか。クラッシュログでこれを取得しました。無料ページ:371有線ページ:12192パージ可能なページ:0最大プロセス:DTMobileISこれはどういう意味ですか?どこで気をつけるべきですか?ありがとうございました。
srikanth rongali 2010年

9
@srik:新しい質問をしたほうがいいです。
kennytm 2010年

@kennytm:これはios8でも可能ですか?関数がで定義されていることを確認しましたlibsystem_c.dylib。先に進んで使っていただければ幸いです。ありがとう
focs 2015

12

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関数を使用して、ファイルの一部をメモリにマップしたり、メモリからマップしたりします。ファイルをメモリにマッピングする方法の詳細については。
  • 無制限の問題セットを回避する:無制限の問題セットは、計算するために任意の量のデータを必要とする場合があります。セットに使用可能なメモリよりも多くのメモリが必要な場合、アプリは計算を完了できない可能性があります。アプリは可能な限りそのようなセットを避け、既知のメモリ制限の問題に対処する必要があります。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.