UINavigationControllerを使用する場合のオブジェクトのリリース
-
03-07-2019 - |
質問
UINavigationControllerを使用していますが、新しいビューをプッシュするときにオブジェクトを解放できません。プッシュする前に、新しいコントローラーにオブジェクトを設定したい。現在これを行っている方法は次のとおりです。
OpenPageViewController *varOpenPageController = [[OpenPageViewController alloc] initWithNibName:@"OpenPageViewController" bundle:nil];
varOpenPageController.bookObj = bookObj;
[[self navigationController] pushViewController:varOpenPageController animated:YES];
//[varOpenPageController release];
その最後の行のコメントを解除すると、コントローラー全体に戻るときにプログラムがクラッシュします。また、オブジェクトをいつ/どのようにリリースするかに関する別の質問もあります。 bookObjには、Pageオブジェクトの可変配列があり、現在のページオブジェクトのテキストを変更したいです。私はこれを行います:
Page *pageObj = [[bookObj pagesArray] objectAtIndex:currentPage];
pageObj.page_Text = textView.text;
[[bookObj pagesArray] replaceObjectAtIndex:currentPage withObject:pageObj];
//[pageObj release];
最後の行のコメントも外すと、プログラムがクラッシュします。前方に移動できますが、後方に移動して再び前方に移動しようとするとクラッシュします。
オブジェクトの自動解放でも同様の結果が得られます。可能であればアドバイスしてください。ありがとう。
編集:最初のサンプルvarOpenPageControllerをリリースし、Leaksでシミュレーターを実行すると、プログラムは適切に機能しているように見えます。ただし、リークを実行しないとクラッシュします。なぜこれが起こるのか、誰にもアイデアはありますか?ありがとう。
解決
Appleメモリ管理ドキュメント。 2番目のアイテムには、bookObj配列内の実際のアイテムへの参照のみが含まれているため、pageObjを解放する必要はありません。理にかなっている場合、実際のアイテムではありません。したがって、実際に実行しているのは、配列から実際のアイテムを解放することです。そのため、戻ってアクセスしようとすると、そこにはありません。
経験則では、作成したもののみをリリースします。
他のヒント
View ControllerをNavigation Controllerにプッシュする最初の例は、リリースでは正しいです。戻ったときにクラッシュしている場合は、OpenPageViewController deallocメソッドに何か問題がある可能性がありますが、Navigation ControllerがView Controllerを保持しているため、何かが間違っていることを示していますコードで行ったようにView Controllerインスタンスを割り当てました。