UINavigationControllerを使用する場合のオブジェクトのリリース

StackOverflow https://stackoverflow.com/questions/401389

  •  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インスタンスを割り当てました。

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