iphone - iPhone-低メモリ状態に対処する方法

iphone objective-c memory-management didreceivememorywarning viewdidunload

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


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


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

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


initWith .....デフォルトの静的値を設定する必要があります。
viewDidLoadは非静的オブジェクトをロードする必要があります
didReceiveMemoryWarningはこれらの非静的オブジェクトを解放する必要があります
viewDidUnloadで何ができる/する必要があるのか​​わかりません...


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

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

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

シナリオ1


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


シナリオ2


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


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

そして、いつそれらを再びロードしますか?ロード(viewDidLoad)、メモリ警告を受け取り、アンロード(viewDidUnload)するviewControllerがありますが、それに戻ると、viewDidLoadが再度呼び出されません。これはviewWillAppearで行う必要がありますか? viewWillAppearがトリガーされたときはいつでも、その上に表示されるはずのものがロードされていると想定できますか?

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

ご協力ありがとうございました。
答え
私の考えは、アプリがメモリ不足の警告を受け取ったときに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では、新しいビューが開いたときにデータを保存します。

これが理にかなっているといいのですが...
関連記事

iphone - プログラムでキーボードを閉じるにはどうすればよいですか?

iphone - デバイスがxcodeオーガナイザーウィンドウで認識されない

iphone - シーケンシャルUIView変換

iphone - UITextFieldsにテキストが追加されたときに、UIReturnKeyGoとUIReturnKeyNextを切り替えるにはどうすればよいですか?

c# - UITableViewでランダムに「NIBをバンドルでロードできませんでした」

iphone - PrintScreenを使用したり、画面の一部に画像を保存したりできますか?

iphone - プロパティtxtname(uiTextView *)のタイプがivar txtname(uiTextView)と一致しません

iphone - ビューとWebサービスの同期呼び出しの読み込みに関する問題

iphone - AppStoreでのホームオートメーションアプリのアップロード

iphone - 特定のiOSバージョンでサポートされていないライブラリをバイパスする方法は?