iOS App启动流程

来源:互联网 发布:淘宝源氏的人物手办 编辑:程序博客网 时间:2024/04/28 04:09

这里写图片描述


Xcode4.2 app启动流程图

以上是Xcode4.2时候 那种不采用storyboard应用的默认启动流程图。对于采用了storyboard的应用,UIApplicationMain()将会额外加载应用的主要storyboard文件,从而创建窗口和初始视图。

但是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中添加控件,实现应用程序界面。

0 0
原创粉丝点击