3

iOS のアプリは、次のメカニズムを介してメモリ不足の警告を受け取ります。

  • [AppDelegate applicationDidReceiveMemoryWarning:]

  • UIApplicationDidReceiveMemoryWarningNotification

  • [UIViewController didReceiveMemoryWarning]

これらの項目の間にはどのような関係がありますか? それらはすべてメモリ不足の状態を受信したときに発生しますか、それとも微妙な違いがありますか? それらはどのような順序で実行されますか?

シミュレータには、「メモリ警告をシミュレートする」オプションがあります。didReceiveMemoryWarning:これは、すべての UIViewControllersで呼び出される以外に何かしますか?

Xcode プロファイラー ツールを使用して、キャッシュ メソッドによって読み込まれた画像の周りで最近何が起こっているかを確認したいと考えています[UIImage imageNamed:]。それらはキャッシュされていませんか? -- しかし、大量のメモリを割り当てるだけであっても、メモリ不足の状態を「適切に」トリガーする方法を知る必要があります。

4

2 に答える 2

3

UIImageのキャッシュに関する質問への回答としてimageNamed、はい、キャッシュをパージしているようです。ここでは、225 個のイメージをロードimageNamedし、実行の 20 秒後にメモリ警告をシミュレートしました。

imageNamed の割り当て

imageNamedそうは言っても、キャッシュは鈍い手段だと思います.を介して独自のキャッシュを作成することを好みNSCacheますcountLimit. 余談ですが、NSCacheは に応答しませんがUIApplicationDidReceiveMemoryWarningNotification、実際のメモリ不足の状況では自動的にパージされます。ただし、シミュレーターで手動でシミュレートするメモリ警告には応答しません。

とにかく、これは を使用してイメージをロードするログですNSCache。最初は を使用せず、countLimit次に をcountLimit50 にして、それぞれの最後にキャッシュをパージします。

countLimit を使用しない場合と使用した場合の NSCache

于 2013-02-05T15:05:01.467 に答える
0

部分的な答え:

シミュレーター (iOS シミュレーター 6.0 の iOS6.1) で、「メモリ警告のシミュレート」により、次の順序で 3 つのメカニズムすべてがトリガーされることを確認しました。

  1. [AppDelegate applicationDidReceiveMemoryWarning:
  2. [UIViewController didReceiveMemoryWarning]
  3. UIApplicationDidReceiveMemoryWarningNotification
于 2013-02-05T14:04:25.127 に答える