2012-02-08 10 views
0

内部のUIViewControllerプロパティがあります:あなたがからNavControllerという名前のナビゲーションコントローラを持っており、このようないくつかのコードを入力した場合iPhone/iPad UINavigationControllerプロパティはUIViewController内にありますか?

@property(nonatomic, readonly, retain) UINavigationController *navigationController 

私は、このプロパティは使用されているか...私はそれを見る方法としては本当にわからない。

[navController pushViewController:nextController animated:YES]; 

いくつかのことが起こります。最初のnextControllerはnavControllerのスタックの上にプッシュされます。次に、navControllerはnextControllerを保持します。第3に、nextController(navigationController)のreadonlyプロパティはnavControllerで初期化されます。そうすれば、navControllerはnextControllerを保持し、nextControllerはnavControllerを保持します。これにより、navControllerを解放すると、スタック上のすべてのUIViewControllerによって保持されるため、navControllerは破棄されません。リリースする唯一の方法は、スタックからすべてのアイテムをポップしてからリリースすることです。

これはどのように機能するのですか、何か不足していますか?

答えて

0

はい、nextControllerのdeallocメソッドが呼び出されると、ナビゲーションコントローラが解放されます。したがって、navControllerを解放すると、そのすべてのプッシュされたView Controllerが解放され、navControllerが解放されます。 つまり、ナビゲーション・コントローラを解放すると(リリース・カウントがゼロであると仮定して)、プッシュされたすべてのビュー・コントローラがポップされます。例

UIViewController *vc = [[UIViewController alloc] init]; 
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:vc]; 

ため

+0

releaseメソッドがOBJECのカウントを保持するときに呼び出されるdeallocメソッド、内部で呼ばれている必要があるのリリースで、この[vc.navigationController pushViewController:detailViewController animated:YES];

ようにそれを行うことができますtはゼロです。したがって、navControllerでreleaseを呼び出すと、保持カウントはゼロではありません(スタック上のすべてのUIViewControllerがそれを保持していることを忘れないでください)。そして、彼のdeallocメソッドは呼び出されません。問題は、navControllerのdeallocメソッドでは、すべてのプッシュされたコントローラが解放されます(すべてのnavControllerのretain countは、その前ではなくゼロでなければなりません)。しかし、このメソッドは呼び出されません。 – MegaManX

+0

今問題を理解しています。しかし、ナビゲーションコントローラをリリースすると、うまくいき、リークが発生しません。ナビゲーションコントローラ上でビューコントローラが保持する時間は、ナビゲーションコントローラがサブビューを追加している間のみです。 – Gabriel

+1

これに関する詳細。私はそれをテストし、ビューコントローラを押したときに、ナビゲーションコントローラのインクリメントされたretainCountが取得されますが、そのインターフェイスループが終了するまでです。その後、ナビゲーションコントローラの保持カウントは、以前の値で再び復元されます。したがって、View Controllerの実際の保持プロパティではありません。 – Gabriel

0

すでにナビゲーションコントローラを持っていると、あなたはナビゲーションコントローラに対処するために、このプロパティを使用することができ、その中のViewControllerを押した場合...今、あなたはナビゲーションコントローラ内のあなたのVCを持っていますあなたが別のVCを表示したい場合..あなたは、あなたがちょうど[vc release]; [navController realese];

関連する問題