2011-07-31 2 views
0
navigationController = [[[UINavigationController alloc] initWithRootViewController:firstMenuView] autorelease]; 
[view addSubview:navigationController.view]; 

ビューはナビゲートコントローラに保持されますか?またはそれを保持する必要がありますか?私の管理コントローラは保持されるか、それとも解放されますか

navcontroller.view removefromparentを呼び出すと実際にnavコントローラが解放されますか?

答えて

2

コントローラーがビューのownerである場合、コントローラーはビューに弱い参照(非retain)を保持しますが、コントローラーはビューへの強い参照を保持します。この場合、あなたのnavigationControllerはオートレリースされているので、理論的には解放されなくてはなりません。それ以外の人は誰もいない限りretainです。

navControllerのビューは、サブビューとして別のビューに追加されました。つまり、親ビューによって保持されます。これは問題です。ビューにコントローラへの呼び出しがあると、それらの呼び出しは割り当て解除されたオブジェクトに移動するためです。 これのためにあなたはEXC_BAD_ACCESSを取得し、アプリケーションがクラッシュする時間は99%です。他の1%はずっと悪いです。

幸いにも、上記の災害を防ぐために必要なのは、あなたのナビゲーションコントローラを "所有"して、それを@property(保持)してナビゲーションコントローラを割り当てるものです。 (自動リリースを維持する、その部分は良いです) ナビゲーションコントローラを所有するのに適しているのは、親ビューのビューコントローラとアプリケーションデリゲートです。

このようにして、コントローラーは少なくとも1回は保持されているため、必要な限り長く動きます。

ここで重要なのは、コントローラとビューの区別です。ビューオブジェクトは保持され、コントローラオブジェクトはalloc'dされ、次にオートレリースされるので、保持しなければ消えてしまいます。

1

addSubview:は、navigationController.viewを保持する。それを親のreleasesから削除します。あなたがそれをオートレリースしたので、あなたはそれを保持したり解放したりする必要はありません。あなたのために処理されます。

+1

を除いて、彼はそれを自動リリースしました – Colin

+0

編集されました - ありがとう。 –

0

いいえ、ビューコントローラはビ​​ューコントローラがビューコントローラののプロパティであるため、リリースされません。ビューコントローラのビューは、ビューコントローラと同じオブジェクトではありません。ビューコントローラを親ビューに追加していません。

関連する問題