2012-01-13 53 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; 
} 
相关问题