質問

UIViewControllersを再利用するのに最適な方法は何ですか?多くのアプリ(Appleの例:SQLiteBooksなど)では、UIViewControllersが割り当てられて初期化され、UIViewControllerがスタックにプッシュされます。これにより、オブジェクトがメモリ内に残り、再び使用されないため、新しいコントローラーごとにメモリの使用量が増加します。

改善する方法

役に立ちましたか?

解決

これは、新しいViewControllerを作成するときに行うことで、ビューがウィンドウから削除されるとメモリが解放されます

MyViewController *mvc = [[[MyViewController alloc] initWithNibName:@"MyView" bundle:nil] autorelease];
[[self navigationController] pushViewController:mvc animated:YES];

他のヒント

  

これにより、メモリの使用が増加します   すべての新しいコントローラー、なぜなら   オブジェクトはメモリ内にとどまり、   再び使用します。

他に保持しているものがない限り、スタックがポップされたときに解放される必要があります。 deallocメソッドが呼び出されることを確認します。

また、スタックにプッシュされる場合は、少なくともポップされるまでそれを保持する必要があります(標準パターンに従うと自動的に発生します)。そのため、 再び使用されます。

したがって、標準のパターンに従うことで、メモリの使用量をできるだけ少なくすることができます。

実際に対処しようとしているメモリの問題がありますか、これは時期尚早な最適化?特定のリソースの問題がない限り、ベストプラクティスは標準のビューコントローラーパターンに従うことです。

View Controllerのdealloc関数にブレークポイントを設定し、View Controllerをウィンドウから削除するときに呼び出されることを確認します。メモリが蓄積し続けるべきではありません。コントローラーを適切に作成および自動解放している場合(上記のLostInTransitに示すように)、各コントローラーのメモリは、削除されたときに解放される必要があります。

deallocが呼び出されないことがわかる場合、アプリのどこかにView Controllerへの参照がまだ存在していることを意味します。

View Controllerは自分のビューではないことを忘れないでください。

View Controllerが保持するViewはアンロードできるため、View Controller自体は非常に軽量です。フットプリントを本当に軽く保ちたい場合は、コントローラーがviewDidUnloadで割り当てた他のデータを無効にすることができます(ほとんどがメモリ警告があるときに呼び出されます-ただし、3.0のみです)。

前述したように、ほとんどの場合、View Controllerは離れると(割り当てられたときに)割り当てが解除されるため、通常はとにかくぶら下がることはありません。しかし、ユーザーが残したのと同じ状態でビューを再度開きたい場合は、参照を残しておくと便利な場合があります(アプリの起動時に機能しません)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top