所以,正如你所提到的,在main.m
文件中的main()
函数是起点,然后调用UIApplicationMain()
。如果你查看文档,你会发现UIApplicationMain
有四个参数:
- argc,
- *argv[],
- *principalClassName,
- *delegateClassName。
这其中的前两个参数只是从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]];
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/
UIApplicationMain()
永远不会返回。应用程序是通过调用exit()
终止的。因此,在main()
中放置在UIApplicationMain(argc, argv, nil, nil);
之后的任何内容都将永远不会被执行。绝对不会。 - Dave DeLong