2012-01-13 7 views
0

この例では、ビッグオタクレンジiPhoneブック(ページ144分の143)から取られている - ItemsViewControllerはのUITableViewControllerのサブクラスである:IVAR itemsViewControllerを持っていることが必要である理由AppDelegatesにルートコントローラのインスタンス変数があるのはなぜですか?

@interface HomepwnerAppDelegate : NSObject <UIApplicationDelegate> 
{ 
    UIWindow *window; 
    ITemsViewController* itemsViewController; 
} 

.... 
itemsViewController = [[ItemsViewController alloc] init]; 
[window setRootViewController: itemsViewController] 

私の質問は、なぜだけではなく、あります代わりに、次の操作を行います。

... 
window.rootViewController = [[ItemsViewController alloc] init]; 

を私はので、私は、なぜこのことを理解していないそのrootViewControllerを破壊するウィンドウを想定していない時にアプリが終了し、これがあります何のリークを、そして窓アプリの寿命のために存在になります他の多くの例では、ルートコントローラ用に別のiVarがありますか?

TIA

答えて

1

(あなたはARCを使用していない場合)最大の利点は、あなたが何度も何度もキャストすることなく、あなたのビューコントローラのメソッドにアクセスし、できることだけである:

[itemsViewController doSomething]; 
// vs. 
[(ItemsViewController *)window.rootViewController doSomething]; 

アプリによってはあなたがする必要があるかもしれませんバックグラウンド/フォアグラウンドなどのアプリケーションデリゲートコールバックを入力するハンドラを実装する場合など、アプリデリゲートから頻繁にルートビューコントローラを参照してください。

0

あなたがそれを必要としない場合は周りのIVARを維持する必要は全くありません。

ところで、あなたがそれを自動リリースしないとItemsViewControllerが漏れるでしょう。

0

理由は歴史的だと思います。その本が書かれたときに戻ると、ウィンドウとルートビューコントローラは両方ともIBOutletsであり、MainWindow.nibという名前のnibファイルから設定されていました。

また、UIWindowでは、コントロールを割り当てるためのrootViewControllerプロパティを使用していませんでした(rootview controller.viewは単にサブビューとして直接ウィンドウに追加されました)ので、ivarに格納しなかった場合ルートビューコントローラは作成されるとすぐに解放されるため、何も保持されず、アプリケーションが動作しなくなります。

しかし、最近では、iOS4と今のARC以来、基本プロジェクトテンプレートは更新されており、もはやイーバールがなくなっています(もはや必要ではありません)。それはまだビューコントローラのための@プロパティを持っていますが、それは技術的にはもう必要ありません、そして、新しいコントローラをwindow.rootViewCOntrollerに直接割り当てる代わりの解決策はうまくいくはずです。

0

これは完全に文体の選択です。便利なアクセサーを得るための他の方法があります。私は決して私のイヴァールを作成しないでくださいrootViewController決して変更されません。私は通常、読み取り専用のプロパティのために行きます。

@property (nonatomic, readonly) MyRootViewController *rootViewController; 

- (MyRootViewController *)rootViewController { 
    if ([self.window.rootViewController isKindOfClass:[MyRootViewController class]) { 
     return (MyRootViewController *)self.window.rootViewController; 
    } 
    return nil; 
} 
関連する問題