内部の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は破棄されません。リリースする唯一の方法は、スタックからすべてのアイテムをポップしてからリリースすることです。
これはどのように機能するのですか、何か不足していますか?
releaseメソッドがOBJECのカウントを保持するときに呼び出されるdeallocメソッド、内部で呼ばれている必要があるのリリースで、この
[vc.navigationController pushViewController:detailViewController animated:YES];
ようにそれを行うことができますtはゼロです。したがって、navControllerでreleaseを呼び出すと、保持カウントはゼロではありません(スタック上のすべてのUIViewControllerがそれを保持していることを忘れないでください)。そして、彼のdeallocメソッドは呼び出されません。問題は、navControllerのdeallocメソッドでは、すべてのプッシュされたコントローラが解放されます(すべてのnavControllerのretain countは、その前ではなくゼロでなければなりません)。しかし、このメソッドは呼び出されません。 – MegaManX
今問題を理解しています。しかし、ナビゲーションコントローラをリリースすると、うまくいき、リークが発生しません。ナビゲーションコントローラ上でビューコントローラが保持する時間は、ナビゲーションコントローラがサブビューを追加している間のみです。 – Gabriel
これに関する詳細。私はそれをテストし、ビューコントローラを押したときに、ナビゲーションコントローラのインクリメントされたretainCountが取得されますが、そのインターフェイスループが終了するまでです。その後、ナビゲーションコントローラの保持カウントは、以前の値で再び復元されます。したがって、View Controllerの実際の保持プロパティではありません。 – Gabriel