2013-05-02 9 views
9

iOSアプリケーションがログインプロンプトで開きます。ユーザーがログインすると、メインビューに切り替わります。ログイン成功後のRootViewControllerの再割り当て

アプリケーションではdidFinishLaunchingWithOptions、私はRootViewControllerをLoginViewControllerに設定しました。 LoginViewControllerはそのデリゲートとしてAppDelegateがあります

LoginViewController *login = [[LoginViewController alloc] init]; 
[login setDelegate:self]; 
[[self window] setRootViewController:login]; 

ログインに成功すると、LoginViewControllerはAppDelegateのuserDidLoginメソッドを呼び出します。

if([[self delegate] respondsToSelector:@selector(userDidLogin)]) { 
    [[self delegate] userDidLogin]; 
} 

userDidLoginは新しいUINavigationControllerを作成し、RootViewControllerとしてそれを割り当てます。

- (void)userDidLogin 
{ 
    MainRecordViewController *mainRecordViewController = [[MainRecordViewController alloc] init]; 
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:mainRecordViewController]; 
    [[self window] setRootViewController:navController]; 
} 

NSLogをLoginViewControllerのdeallocメソッドに追加すると、LoginViewControlその段階でlerが破壊され、その実行は期待通りに継続されます。

私はLoginViewControllerを明示的に閉じるために何もしていませんが、新しいRootViewControllerを割り当てることは古いものが消えてARCによって整理されるという仮定に依存しています。

私はそれが常にそうであることに頼ることができますか?これは合理的なアプローチですか?

ありがとうございます。

ジェームズ

+1

サイドノート:ARCによって何がリリースされないのかわからない場合は、deallocメソッドを実装してNSLog(@ "MySuperDuperClassのインスタンスがARCによって割り当て解除されました")のようなものを表示できます。 – Groot

+0

ありがとうございます - 私はすでにそれを行っています。それは私が「NSLogをdeallocメソッドに追加することによって」という意味です。ビューは正しく閉じられているように見えますが、常に割り当てが解除されているように見えますが、私はそれが常に働くことに頼ることができるのだろうかと思っていました。私はそれがうまくいると思うが、それは間違って行くかもしれないという前提のように感じる... – James

答えて

11

rootViewController財産状態のdocumentation:ウィンドウは、既存のビュー階層を持っている場合

は、古いビューがインストールされている新しい前に削除 です。

LoginViewControllerへのあなた自身の参照を保持しないと、それは破壊されます。

おそらく:RootViewController Switch Transition Animationは、ルートビューコントローラ をアニメーションに切り替える方法について説明しているので、おもしろいです。

+1

私はそれが好きです - 答え、美的洗練。とても有難い。 – James

関連する問題