4

内部に5つのビューコントローラーを備えたナビゲーションコントローラーベースのアプリケーションがあります。ビューコントローラーをプッシュすると、メモリが割り当てられ、popViewController に戻ると、delloc() メソッドが正しく呼び出されます。プッシュおよびポップするすべてのView Controllerに対して、deallocが正しい方法で呼び出されると確信しています。

それにもかかわらず、Instruments を使用してアプリケーションを実行すると (パフォーマンス ツールから開始 -> オブジェクトの割り当て、リーク)、奇妙な動作が発生します。ビュー コントローラーがポップされている場合、メモリ使用量は減少しません。正確には、期待どおりに減少しません。アプリケーションを起動すると、950 KB が使用されます。次に、最初のビュー コントローラーをプッシュすると、メモリ使用量が 1,56MB まで増加します。 、最後にView Controllerをポップすると、メモリ使用量は1,55MBになりました。

この動作は正しいですか?? ビューをポップするたびにすべての dealloc メソッドが正しく呼び出され、Leaks インストゥルメントがメモリ リークを示さないことを確信しています。オペレーティングシステムが何らかの方法でビューを「保持」しているため、同じView Controllerを2回目にプッシュすると、ロードプロセスがはるかに高速になると思います...

この振る舞いが正しいことを誰かが確認できますか? ありがとう

Instrumentsからのこのスクリーンショットを参照してください

4

1 に答える 1

6

これは予想通りです。ここでも、「割り当て、コピーなどを行ったオブジェクトに対してのみ責任を負う」というメモリ処理ルールが適用されます。

あなたがnavigationControllerに何かをプッシュするとき、私はあなたがこのようにそれをすると思います:

MyController *myCon = [[MyController alloc] init];
[self.navigationController pushViewController:myCon animated:YES];
[myCon release]; //You have alloc and release.

NavigationControllerは、多くの場合、ユーザーがデータセットをドリルダウンしてから再度ドリルアップする階層を処理します。メモリが十分にあるときにコントローラーを保持することにより、navigationControllersは、コントローラーを5秒間再度インスタンス化する必要をなくすことができます。後でユーザーが「戻る」をタップしたとき。これは、deallocが呼び出されることはないためにわかりますが、バックアップ時にviewWillAppearとviewDidAppearが呼び出されます。メモリが不足している場合、navigationControllerはスタック上のコントローラーの解放を開始します。

だが!前後に移動しても、viewControllersが何度もインスタンス化されないようにしてください。これにより、メモリフットプリントが大きくなり、リークが発生します。NavigationControllerは、スタックにviewControllerがすでに存在することを認識し、単に表示する必要があります。

すべてのビューを移動できるはずです。ビューがメモリに「収まる」場合、アプリはこれからメモリフットプリントを増やすことはありません。

于 2010-06-04T10:22:53.847 に答える