以上是Xcode4.2中不采用storyboard应用的默认启动流程图。对于采用了storyboard的应用,UIApplicationMain()将会额外加载应用的主要storyboard文件,从而创建窗口和初始视图。
main()的变化
main()仍然是应用的起点,其代码如下:
int main(int argc, char *argv[])
{
}
main()采用了新的@autoreleasepool{}函数,以便支持LLVM3.0。但这一变化不会影响应用 的启动顺序。需要注意的是UIApplicationMain第四个参数的变化,之前是nil,而这里已经更改了。如果查看相关文档(https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIKitFunctionReference/Reference/reference.html#//apple_ref/doc/uid/TP40006894-CH3-SW7),就会知道第四个参数代表“应用的delegate初始化的类名”,如果从应用的主nib文件加载代理对象,则将该参数指定为nil。
显然,我们的应用代理将不会由之前的MainWindow.xib加载,而是直接由UIApplicationMain()函数创建。实际上,项目中已经不再有MainWindow.xib文件。
在Xcode4.2及以后版本去掉main nib文件的原因很可能是storyboarding的导入。storyboards基于视图控制器,而非视图或窗口。
最后,对于non-storyboarding的应用,由于取消了MainWindow.xib,因此在AppDelegate.m中的didFinishLauchingWithOpt
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOp
{
}