以上是Xcode4.2中不采用storyboard应用的默认启动流程图。对于采用了storyboard的应用,UIApplicationMain()将会额外加载应用的主要storyboard文件,从而创建窗口和初始视图。
main()的变化
Main函数仍是应用的起点,其代码如下:
int main(int arg,char *argv[])
{
@autoreleasepool{
return UIApplicationMain(argc,argv,nil,NSStringFromClass([AppDelegate class]));
}
}
main()采用了新的@autoreleasepool{}函数,以便支持LLVM3.但这一变化不会影响应用的启动顺序。
我们再来看看UIApplicationMain函数
int UIApplicationMain{
int argc,
char *argv[],
NSString *principalClassName,
NSString * delegateClassName
}
第一个参数表示参数的个数,
第二个参数表示装载函数的数组,
第三个参数,是UIApplication类名或其子类名,若是nil,则默认使用UIApplication类名。
第四个参数是协议UIApplicationDelegate的实例化对象名,如果是nil,则从main nib文件中加载委托对象。这个对象就是UIApplication对象监听到系统变化的时候通知其执行的相应方法。
在我们生成的HelloWorld应用程序中,第三个和第四个参数都为nil,那就是UIApplication和HelloWorldAppDelegate了
需要注意的是第四个参数的变化,之前是nil,而这里已经更改了。第四个参数代表该应用的Delegate初始化的类名,如果从应用的主nib文件加载代理对象,则将该参数设置为nil。
显然,我们的应用代理将不会由之前的MainWindow.xib加载,而是直接由UIApplicationMain()函数创建。实际上,项目中已经不再有MainWindow.xib文件。
在Xcode4.2以及以后的版本去掉main xib文件的原因很可能是storyboard的导入。storybo基于试图控制器,而非视图或窗口。
HelloWorldAppDelegate实现了UIApplicationDelegate协议,可以重写其所有方法。
我们在打开HelloWorldAppDelegate文件,我们会看到这样的代码:
-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
self.window.rootViewController=self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
我们知道,每个应用程序有个UIWindow,这window负责管理和协调应用程序的屏幕显示。在这里把HelloWorldViewController实例赋值给window的rootViewController,rootViewController的view将会作为UIWindow的首视图。
好的,我们就可以在HelloWorldViewController的loadView里添加我们需要的控件了。
总结程序的启动过程如下:
1.程序入口main函数创建UIApplication实例和UIApplication代理实例。
2.在UIApplication代理实例中重写启动方法,设置第一ViewController。
3.在第一ViewController中添加控件,实现应用程序界面。