因此,正如您所提到的,main()
函数 inmain.m
是起点,然后调用UIApplicationMain()
. 如果您查看文档,您会发现它UIApplicationMain
需要四个参数:
- argc,
- *argv[],
- *principalClassName
- *委托类名。
其中前两个只是从传递的参数计数和变量列表main()
。但是第三个和第四个参数是指向 NSStrings 的指针。第三个参数指定应该是哪个类UIApplication
。除非您打算进行子类化UIApplication
,否则请指定nil
第三个参数。第四个参数指定哪个类应该是 UIApplication 的委托类,它将响应UIApplicationDelegate
协议中指定的任何内容。您不必直接处理它,因为它包含在所有 Xcode 模板中:
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
不要让NSStringFromClass([AppDelegate class]))
钻头扔掉你。这只是指定第四个参数的一种奇特方式,以便在您以后更改AppDelegate.m
.
UIApplication
启动主事件循环并调用-application:didFinishLaunchingWithOptions:
它的委托必须处理的方法之一。看一下AppDelegate.m
,你会发现这个方法的一些模板代码。UIWindow
这是您可以开始自定义的地方,创建在创建和其他实例之前需要到位的东西UIView
:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
因此,现在定义了应用程序窗口和根视图控制器,并且应用程序已关闭并正在运行。
所有这一切,还有更多,在这里得到了很好的解释:http: //oleb.net/blog/2012/02/app-launch-sequence-ios-revisited/