0

背景:現在 4 つのタブを含むタブ バー コントローラーがあります。タブのうち 3 つは、データの表示、編集、および作成のためのテーブル ビューの階層を表示するナビゲーション コントローラーです。データは通常、ユーザーから取得され、グローバル変数に格納される NSString です (データには、階層内の複数のビューと複数のタブからアクセスする必要があります)。

問題アプリが起動するとすぐに大量のメモリを使用していることに気付きました(~11mb )。ただし、テーブル ビューをスクロールし、nav コントローラーを使用してさらに多くのテーブル ビューにアクセスし、一部のデータを編集すると、メモリ使用量がすぐに 20 MB 近くまで上昇します。最悪の部分は、詳細ビュー コントローラーから飛び出しても、メモリ使用量が減少しないことです。20〜21MB前後でホバリングし、そしてプロセスを繰り返すと、メモリ使用量がますます高くなるようです。Leaks でアプリをテストし、すべての問題を解決しました。非アクティブなビュー コントローラーは、現在表示されていなくても、まだメモリに残っていると思われます。ナビゲーション コントローラーの階層で不要なビュー コントローラーを解放したり、非アクティブなビュー コントローラーをタブ バーから解放したりする方法はありますか? didReceiveMemoryWarning:私は Apple のドキュメントを読んでいますが、ビュー コントローラーとapplicationDidReceiveMemoryWarning:アプリ デリゲートを同様に実装することを強くお勧めします。これらの方法をどこから始めればよいか本当にわかりません。どのコントローラーを解放できますか? また、それらを再作成するにはどうすればよいですか? その責任は私にあると思いますが、確認したいと思います。

メモリ使用量が少ないため、まだアプリを終了させて​​いませんが、データ入力を何度も繰り返すと (多くのビュー コントローラーのプッシュとポップ)、クロールが遅くなることに注意してください。

4

2 に答える 2

3

同じ画面を繰り返し表示すると、メモリ使用量がますます高くなる場合は、リークが発生しています。リークが検出されないという事実は、リークがないという意味ではありません。保持すべきではないデータを保持している場合、ガベージ コレクションされたプログラムでさえリークする可能性があります。

Instruments with Object Allocations テンプレートを呼び出して、メモリの大部分を消費しているものを確認します。まだ記憶にあるはずのないものを見てください。View Controller がメモリ不足になっていると思われる場合は、 を入れてNSLog()、実際-deallocメモリ不足になっていることを確認してください。

View Controller に実装する必要がdidReceiveMemoryWarningあります。Apple は、 Nib オブジェクトのメモリ管理 で実装方法に関するガイドを提供しています。少なくとも、ログ ステートメントを実装して、didReceiveMemoryWarning警告を受けているかどうかを確認する必要があります。しかし、それが実際の問題である可能性は低いです。このメソッドの実装に失敗しても、メモリ リークは発生しません。メモリ不足の状況でできるだけ速くメモリを解放できなくなるだけです。

Cocoa メモリ管理の第 1 のルールに従っていますか: アクセサーを使用する必要がありますか? インスタンス変数を直接いじらないでください。ほとんどのメモリ管理の問題は解消されます。

于 2009-08-05T22:04:55.210 に答える
0

実際、iPhone OS 3.0 以降のUIViewControllerサブクラスでは、通常、の代わりにviewDidUnloaddidReceiveMemoryWarningを実装する必要があります。現在のUIViewControllerビューが表示されていない場合、メモリの少ないシステムで自動的に呼び出されます。そこのようなものを解放する必要IBOutletsがあります。これにより、実際のビューが解放されます。これは、それらが再び表示された場合にviewDidLoad最初に呼び出されるため、問題ありません。

didReceiveMemoryWarningが表示されているときでも流すことができるある種のメモリがある場合UIViewController(キャッシュなど)は、場合によってはまだ適切です。

于 2009-08-05T23:21:31.077 に答える