2

アプリがメモリ不足の警告メッセージを受け取ると、次の 3 つの状況が発生する可能性があります。

  1. アプリが起動されたばかりで、ユーザーが特別なことをしていない
  2. アプリが実行中で、現在のコンテキストがある
  3. アプリは実行中のコンテキストでバックグラウンドにあります

したがって、このメッセージを受け取ったら、メモリを解放する必要があります...しかし、どこで? そしてどうやって ?

という事は承知しています :

  1. initWith..... デフォルトの静的値を設定する必要があります。
  2. viewDidLoad非静的オブジェクトをロードする必要があります
  3. didReceiveMemoryWarningこれらの非静的オブジェクトを解放する必要があります
  4. 何ができるか、何をしなければならないかわかりませんviewDidUnload...

いくつかの保持された値は、どこかで nil に設定する必要があると思います... didReceiveMemoryWarning で?

そして、アクティブなコンテキスト (画面の物の位置、表示されたテキストなど) で何をしなければならないので、viewDidLoad が再度呼び出されると、それらは memoryWarning 呼び出しの前の場所に再び表示されますか?

つまり、2 つのシナリオを想像してください。

シナリオ 1

  1. あなたは何かに取り組んでいます... フィールドにテキストを書きましたが、それを保存せず、別のビューを開き、画面上のビューを移動しました。
  2. アプリをバックグラウンドで送信します。
  3. 次に、memoryWarning がアプリに送信されます。
  4. その後、ユーザーはアプリをフォアグラウンドに送信します。以前のビューと同じように、現在のビューで終了時のように表示する必要がありますが、すべてが解放されている場合、どうすればこれを行うことができますか?

シナリオ 2

  1. あなたは何かに取り組んでいます... フィールドにテキストを書きましたが、それを保存せず、別のビューを開き、画面上のビューを移動しました。
  2. 次に、memoryWarning がアプリに送信されます。
  3. ビューにあるものや、前のビューにあったものを失いたくありません。リリース/リロード機能のために画面がちらつきたくありません。これにどう対処しますか?

これらのメモリ警告が発生した場合、ディスクに書き込んで後で表示する以外に選択肢はありますか?

そして、いつそれらを再度ロードしますか?ロード (viewDidLoad) し、memoryWarning を受け取り、アンロード (viewDidUnload) する viewController がありますが、それに戻ると、viewDidLoad は再度呼び出されませんか? これは viewWillAppear で行う必要がありますか? viewWillAppear がトリガーされるたびに、そこに表示されるはずのものが読み込まれていると考える必要がありますか?

貴重なリンクがあっても、どんな助けも素晴らしいでしょう!

ご協力ありがとうございました。

4

2 に答える 2

1

シナリオの代替案を検討してください。十分なメモリを解放しないと、アプリが強制終了される可能性があります。これは、ユーザーにとってさらに不快なものになります。ユーザーの貴重なデータを失うことよりも、現在の表示をちらつく可能性があることを選択するかもしれません。

于 2012-01-22T19:16:38.513 に答える
1

私の考えでは、アプリがメモリ不足の警告を受け取ったときに2つのメソッドが呼び出されます。

didReceiveMemoryWarning // in your NSObjects

applicationDidReceiveMemoryWarning // in your app delegate

次に、メモリを解放する場合は、これらの方法を検討してください。

そこで何ができるかについては...まあ...Xcodeが提案することを考えてみてください。

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
    /*
     Free up as much memory as possible by purging cached data objects that can be recreated (or reloaded from disk) later.
     */
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

どうやら、最善の選択は、ユーザーに表示されない、および/または使用されていないオブジェクト、または後で再作成できるキャッシュされたデータを解放することです。GUIに触れないでください。GUIまたはその一部を閉じると、アプリが使用できなくなり、ユーザーはがっかりします。

2つのシナリオに関して、メモリ警告の目的を検討する際に間違いが発生する可能性があります。これらは緊急事態を治療する方法であり、メモリを管理する通常の方法ではありません。開発者は、優れたメモリアーキテクチャを考え、可能な限りデータを保存する必要があります。

シナリオ1では、アプリがバックグラウンドに送信されたときにデータを保存します。

applicationDidEnterBackground

シナリオ2では、新しいビューが開いたときにデータを保存します。

これが理にかなっていることを願っています...

于 2012-01-22T14:42:19.880 に答える