- ベストアンサー
Objective-c画面推移のメモリ管理について
- Objective-c画面推移のメモリ管理についてF
- iPhoneアプリ開発の画面推移方法とメモリ管理についての質問です。
- 画面推移する際にメモリ使用量が増えていく問題について解決策を教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
> SecondViewControllerにも似たコードを記述しMainViewControllerに遷移しています。 これが気になるのですが、SecondViewControllerからMainViewControllerに遷移するのに --------------------------------------------------------- [self dismissViewControllerAnimated:YES completion:nil]; --------------------------------------------------------- で呼び出し元の画面に戻っているのではなく、 --------------------------------------------------------- MainViewController *vc = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil]; [self presentViewController:vc animated:NO completion:nil]; --------------------------------------------------------- という感じにしているのですか? だとしたら使用メモリがどんどん増えていくのは当たり前です。 このコードだと、元の画面に戻っているのではなく、別の新しい MainViewControllerを生成して、それに移動しています。 そして、その別の新しいMainViewControllerは、さらに 別の新しいSecondViewControllerを生成して、それに移動します。 呼び出し元のViewControllerは、いずれ呼び出し先から dismissViewControllerAnimatedされて戻ってくるのを 期待してそれぞれ解放されずに待っている状態です。 元の画面に戻りたいなら、冒頭のdismissViewControllerAnimatedを 使って戻ってください。 > 遷移したあとに元の画面が破棄されていないのでは無いかと思い、コメントアウトにしてある下二行を追加してみましたが、結果は変わりませんでした。 [self removeFromParentViewController]; で自分自身のビューコントローラーを削除していますが、これだけではオブジェクトは破棄 されません。そのビューコントローラーオブジェクトを変数に保持しているものがなくなって 初めて破棄されます。上記のケースだとSecondViewControllerのparentViewControllerプロパティ に、MainViewControllerが保持されていますから、SecondViewController(またはその中の parentViewControllerプロパティ)が破棄されない限り、MainViewControllerは破棄されません。 > 破棄されたことを示すviewDidDisappearをNSLogで確認してみたところ、呼び込まれているのですが、これはC++などでいうデストラクタとは似つかない処理でしょうか? viewDidDisappearは、そのビューコントローラーが画面に表示されなくなった 時に呼ばれます。オブジェクト破棄とは別の話です。
お礼
回答ありがとうございます。 はい、おっしゃられるとおりのコードを書いていました。 [self dismissViewControllerAnimated:YES completion:nil]; をSecondViewControllerで使ったところ、何度行き来してもメモリが増えることはありませんでした。 他の部分の解説も大変有難いです。本当にありがとうございました。