当 Objective-C 应用程序启动时,它通过运行名为 main() 的函数来启动。它不必位于“main.m”文件中,但这就是 Xcode 向导进行设置的方式。
在向导生成的 main() 函数中,有这样一行:
int retVal = UIApplicationMain(argc, argv, nil, nil);
这就是构成整个应用程序的“UIKit”框架的启动。在 UIApplicationMain 内部,创建了一个 UIApplication 类型的对象。当应用程序启动时,UIApplication 执行的部分操作是调用 UIApplication 类的委托成员上的 applicationDidFinishLaunchingWithOptions 方法。该委托在 MainWindow.xib 文件中设置为 ProjectAppDelegate 类的实例,该类是符合 UIApplicationDelegate 协议的 NSObject 的子类。
是什么促使 AppDelegate 最初
运行它是...
因为在 MainWindow.xib 文件中,您已将文件所有者(即 UIApplication 对象)的“委托”出口连接到 .xib 文件中的 UIApplicationDelegate 对象(实际上是项目向导完成了连接),并且该类UIApplicationDelegate 的设置为应用程序的 UIApplicationDelegate 子类。
“MainWindow.xib”并没有什么神奇之处,它可以被称为“Foo.xib”,重要的是 Info.plist 文件中名为“Main nib file base name”的属性是“MainWindow”。尝试将 MainWindow.xib 重命名为 Foo.xib 并将 Info.plist 中的“Main nib 文件基本名称”更改为“Foo”,您会发现它仍然有效。
编辑:有关 RootController 的更多信息
再说一次,所谓的“RootController”并没有什么神奇之处。这只是 Xcode 新建项目向导为您创建的 UIViewController 子类的名称。
该向导将代码放置在两个类的项目中:Project AppDelegate 和Project ViewController。 Project AppDelegate 类包含两个出口成员:
IBOutlet UIWindow *window;
IBOutlet ProjectViewController *viewController;
在 MainWindow.xib 文件中,放置了 UIWindow 和 ProjectViewController 的实例,并将其连接到 ProjectAppDelegate 中的上述出口。
使您的内容显示在屏幕上的是 Project AppDelegate 类中的以下代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// Add the view controller's view to the window and display.
[self.window addSubview:viewController.view];
[self.window makeKeyAndVisible];
return YES;
}
同样,这并没有什么神奇之处:项目向导创建的代码将“根”ViewController 的视图添加到窗口的视图中,并使窗口可见。您的“根”视图控制器是在 .xib 文件中创建的,并连接到 ProjectAppDelegate 出口。
尝试完全自己创建一个应用程序而不使用向导中的任何文件是非常有启发性的。您将学到很多有关 .xib 文件如何工作以及它们与代码对象如何关联的知识。