• 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;防止被释放。

     

     

  • 相关阅读:
    Linux标准C头文件和内核头文件的理解
    linux GCC编译C程序的问题
    C#类型反射、晚期绑定、特性编程的使用背景与分析
    linux下C#开发mongoDB
    C中“指针和数组”引发的探索一
    C#学习记录
    linux下Apache+PHP+mysql+phpMyAdmin源码包安装配置
    基于mongoDB和C#分布式海量文件存储实验
    C中指针和数组引发的探索二
    算法研究学习一(用C和C#实现)
  • 原文地址:https://www.cnblogs.com/mddblog/p/4761245.html
Copyright © 2020-2023  润新知