0

これはおそらく初心者の質問です...

iPhoneアプリのメモリ使用量を削減しようとしています。

ボタンのセットを備えたUIViewControllerがあります。ユーザーがそれらのいずれかをタップすると、アプリはユーザーを新しい画面(新しいUIViewController)に移動します。

それらをオンデマンドで作成する必要がありますか([[MyUIViewController alloc] initWithNibName:@ "MyUIViewController" bundle:nil];)、またはこれらすべてのUIViewControllerを@property「メイン」コントローラーにsとして設定し、初めて作成する必要がありますか?(そうであるかどうかを確認してくださいnil)。

Instruments最初のアプローチに続いて、使用済みメモリ(ライブバイト)はプッシュすると増加しますが、コントローラーをプルすると減少しないなど、ボタンを押すたびに減少することに気づきました。

さらに、それはUITableViewsにも当てはまりますtableView:didSelectRowAtIndexPath:か?メソッドで別のUIViewControllerをプッシュしますか?

前もって感謝します。

編集:私はARCを使用しています

4

5 に答える 5

1

あなたが言った:

(Instrumentsの場合)最初のアプローチに従って、使用済みメモリ(Liveバイト)はプッシュすると増加しますが、コントローラーをプルすると減少しないことに気付きました。ボタンを押すたびに減少します。

では、VC1からVC2に移行するとき、メモリ使用量は大幅に増加していると言っていますが、VC1に戻っても低下していませんか?コードにリークがないか確認しましたか?まず、静的アナライザー(shift+ command+ B)を実行します。これにより、最もひどい間違いのいくつかを特定できます。警告はありません。

次に、プロファイラーを介してInstrumentsでコードを実行し、リークを特定します。Instrumentsユーザーガイドの「漏れの検出」セクションを参照してください。

于 2012-07-07T17:35:19.250 に答える
0

それらを保持して再利用すると、アプリのベースメモリがより高いレベルに保たれますが、オンデマンドで再作成する必要がないため、おそらくパフォーマンスが向上します。

そうは言っても、新しいView Controllerをプッシュするパフォーマンスは、そもそもそれほど悪くはないので(何か間違ったことをしている場合を除いて)、オンデマンドで作成するだけです。

ポップされたときに古いVCメモリが解放されていない場合は、どこかに保持サイクルがある可能性があります。ビューの却下でクリアされていない、作成した可能性のあるデリゲートコードを探します。

于 2012-07-07T17:20:28.997 に答える
0

一般的に、aUIViewControllerはメモリをかなり軽くする必要があります。これUIViewは、ビューのライフサイクルに精通し、ビューをクリーンアップできるようにすることで(View Controllerのviewプロパティ外のどこにも参照を保持せず、nil内の他のビュー参照viewDidUnload)。使用方法については、ここに良い答えがありますviewDidUnload

そうは言っても、View Controllerを作成するのがそれほど重くない限り、必要なときにいつでも再作成する方がよいでしょう。これはメモリ上の理由ではなく、単純にするためです。したがって、他の理由でプロパティでそれらへの参照を保持する必要がない限り、シンプルに保ち、使用するコードを少なくしてください。必要に応じて作成してください。

于 2012-07-07T17:27:23.610 に答える
0

これはおそらく初心者の答えなので、一粒の塩と一緒に取ってください。

このシナリオでは、ViewControllerをコードに実装することについて心配する必要はありません。ストーリーボードを使用して初期ビューコントローラーを作成し、ナビゲーションコントローラーに埋め込みます。次に、後続のビューコントローラを作成し、名前付きのセグエを介して(controlキーを押しながらドラッグして)最初のコントローラのビューの適切な部分にリンクします。この手法を使用することで、チェーンの下流にあるView Controllerは、セグエが起動した後にのみインスタンス化されると思います。Appleはこれを最適化したと確信しているので、ストーリーボードを使用することで、コード内のものをいじくり回すよりも多くのメモリを節約できると確信しています。

于 2012-07-07T17:27:55.763 に答える
0

ここで@RobertRyanとチャットした後(リンクは残ると思います)、彼は私に解決策を教えてくれました:問題は私がVC2で保持サイクルを持っていたということでした(ここですべてを書き直さないようにチャットを見てください) 。どうもありがとう@RobertRyan!

于 2012-07-07T19:21:40.960 に答える