你的应用程序委托集和谁初始化其窗口和viewController属性?

我有一个关于iOS应用程序的新手问题…如果我创build一个名为TestForStackOverflow的新的基于视图的应用程序,Xcode会自动为TestForStackOverflowAppDelegate.h创build如下代码:

@class TestForStackOverflowViewController; @interface TestForStackOverflowAppDelegate : NSObject <UIApplicationDelegate> @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet TestForStackOverflowViewController *viewController; @end 

和TestForStackOverflowAppDelegate.m中的以下内容:

 #import "TestForStackOverflowAppDelegate.h" #import "TestForStackOverflowViewController.h" @implementation TestForStackOverflowAppDelegate @synthesize window = _window; @synthesize viewController = _viewController; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; return YES; } [...] 

这里来我的问题:

1)TestForStackOverflowAppDelegate类在哪里设置为当前应用程序的委托? 它是否“自动”完成? 我已经看到,main.m源文件只包含以下代码:

 int main(int argc, char *argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal; } 

不应该在UIApplicationMain函数调用的第四个参数中设置应用程序委托类吗?

2)TestForStackOverflowAppDelegate类的window和viewController属性在哪里设置?

3)这可能是微不足道的,但为什么我们有综合window = _window,没有在TestForStackOverflowAppDelegate接口中称为_window的实例variables? 我已经看到,你可以在类接口中声明@properties而没有相应的iVars(也许它们是由编译器自动创build的),但这是一个好习惯,还是应该总是在类中创build对应的iVars?

对不起,我只是希望我没有写出太明显的问题,因为在意大利,这里是深夜,我很累。但是当这些问题进入我的脑海时,我不能等待解决scheme :)

应用程序委托类是如何加载的?

在你的-info.plist文件中有一个名为“Main nib file base name”的键,并具有类似于MainWindow.xib的视图。 在这个xib文件中,有一个文件的所有者代理对象,它有一个委托给应用程序的委托类。

在devise器中打开XIB。 注意顶部的文件所有者对象,上下文点击它并查看委托对象。 现在看看(XCode 4)行下面的devise中的对象 – 你应该看到应用程序委托对象。

appDelegate的窗口和viewController在哪里设置?

查看devise器和上下文,单击(XCode 4)行下面的应用程序委托对象。 窗口和viewController目标绑定在那里。

_window iVar

它会自动为您提供。 不清楚它是由编译器inheritance还是生成的。

以下是关于_ iVars的更多信息: 为什么使用前导下划线重命名iOS中的综合属性?

如果您select在代码中执行相同的操作:

删除plist xib引用main.m:传递委托的名字

 int main(int argc, char *argv[]) { int retVal = UIApplicationMain(argc, argv, nil, @"HelloViewAppDelegate"); 

在应用程序委托中:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. CGRect screenBounds = [[UIScreen mainScreen] applicationFrame]; CGRect windowBounds = screenBounds; windowBounds.origin.y = 0.0; // init window [self setWindow: [[UIWindow alloc] initWithFrame:screenBounds]]; // init view controller _mainViewController = [[MainViewController alloc] init]; [[self window] addSubview:[_mainViewController view]]; [self.window makeKeyAndVisible]; return YES; } 

1)简单来说,当调用UIApplicationMain()时,

  • 你find应用.plist,
  • 查找关键的“主要笔尖文件基本名称”
  • 这个XIB是打开的,
  • 支持UIApplicationDelegate协议的对象被实例化并用作应用程序委托

2)他们被设置在XIB,你可以查看他们,如果你

  • 打开主要的XIB,
  • selectAppDelegate对象,
  • 打开该对象的Connections检查器,
  • 看看奥特莱斯部分

3)你是对的,它们是由编译器自动创build的。 它通过减less行数使得代码更具可读性,并且更容易重构,只声明属性的一个地方。

希望能帮助到你!