2012-01-13 51 views
0

這個例子是從大書呆子範圍iPhone書(頁144分之143)拍攝 - ItemsViewController是的UITableViewController的子類:爲什麼AppDelegates具有根控制器的實例變量?

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

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

我的問題是,爲什麼有必要在伊娃itemsViewController,爲什麼不做到這一點,而不是:

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

我相信窗口會破壞它的RootViewController的,當應用程序退出,因此沒有泄漏,該窗口將在現有的應用程序的生命週期,所以我不明白爲什麼和許多其他的例子有一個單獨的iVar的根控制器?

TIA

回答

1

的最大優點是簡單的,你可以訪問您的視圖控制器的方法,而無需投了一遍又一遍:

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

根據您可能需要將應用程序例如,在實現用於輸入後臺/前臺和類似應用程序委託回調的處理程序時,請經常從應用程序委託中引用根視圖控制器。

0

其實完全沒有必要保持伊娃身邊,如果你不需要它。

順便說一句,如果你不autorelease它會泄漏ItemsViewController。 (除非你使用ARC)

0

原因是歷史,我想。在編寫該書時,窗口和根視圖控制器都曾經是IBOutlets,並且是從名爲MainWindow.nib的nib文件中設置的。

此外,UIWindow並沒有使用rootViewController屬性來分配控件(根視圖controller.view只是直接作爲子視圖添加到窗口中),所以如果你沒有將它存儲在伊娃那麼它將不會被任何東西保留,並且您的應用程序將無法工作,因爲根視圖控制器將在創建後立即發佈。然而,現在iOS4和ARC之後,基礎項目模板已經更新,甚至不再有ivars(不再需要)。它仍然有一個視圖控制器的@property,但它在技術上不再需要,你直接將一個新控制器分配給window.rootViewCOntroller的替代解決方案可以正常工作。

0

這是完全的文體選擇。還有其他方法可以獲得便利訪問者。我永遠不會在我的rootViewController中創建一個ivar永不改變。我通常會去只讀屬性。

@property (nonatomic, readonly) MyRootViewController *rootViewController; 

- (MyRootViewController *)rootViewController { 
    if ([self.window.rootViewController isKindOfClass:[MyRootViewController class]) { 
     return (MyRootViewController *)self.window.rootViewController; 
    } 
    return nil; 
} 
相關問題