你的位置:首页 > 操作系统

[操作系统]iOS程序启动过程


  main函数之前的底层环境搭建(代码拷贝、内存的开辟等操作系统相关的开启一个进程)不再描述,我们从main函数开始。

1 main函数

int main(int argc, char * argv[]) {  NSLog(@"===%s",argv[0]);  @autoreleasepool {    /// 函数原型:    // int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));  }}

  这里面的代码一般是不变的。首先是一个自动释放池,保证结束时内存释放,下面是参数介绍:

  argc, argv:是标C的参数,argc为argv数组中元素的个数。argv一般有一个元素argv[0]即当前可执行程序的路径。(另外,在linux系统下我们通过终端打开一个程序可以给它传递参数,具体不再展开。如果不知所云括号里面的自动忽略);

  principalClassName:指定应用程序类,该类必须是UIApplication(或子类)。如果为nil,则用UIApplication类作为默认值,它是一个单例,代表一个进程,也是程序创建的第一个对象,利用UIApplication对象,能进行一些应用级别的操作;

  delegateClassName:指定应用程序类的代理类,该类必须遵守UIApplicationDelegate协议。

2 UIApplicationMain

   1)根据传进的参数创建UIApplication对象;

   2)根据传进的参数创建UIApplication的delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性。

   3)开启一个消息循环

  下面分为storyboard启动和没有storyboard启动

##有storyboard##

3 根据Info.plist加载storyboard

   1)创建UIWindow,UIWindow是一种特殊的UIView,通常在一个App中只会有一个UIWindow(注意是通常,还有其它的,比如弹出的键盘)。设置为主窗口,同一时刻主窗口只有一个,可以通过[UIApplication sharedApplication].keyWindow获取。

   2)创建和设置UIWindow的rootViewController。

   3)显示窗口

 


 

##没有storyboard##

3 delegate对象开始处理(监听)系统事件(没有storyboard)

   1)程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法

       2)在application:didFinishLaunchingWithOptions:中创建UIWindow:window

       3)创建和设置UIWindow的rootViewController

       4)显示并设置window为主窗口:[window makeKeyAndVisible]; 然后self.window = window;防止被释放。