博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
点击APPicon之后都发生了什么
阅读量:7125 次
发布时间:2019-06-28

本文共 2055 字,大约阅读时间需要 6 分钟。

  hot3.png

main函数之前:

1.用户点击应用程序图标

2.dyld(the dynamic link editor即app的动态链接器,把动态库加载进来)开始将程序二进制文件初始化

3.交由ImageLoader读取image,其中包含了我们的类、方法等各种符号

4.由于runtime向dyld绑定了回调,当image加载到内存后,dyld会通知runtime进行处理,runtime接手后调用map_images做解析和处理,接下来load_images中调用call_load_methods方法,遍历所有加载进来的Class,按继承层级依次调用Class的load方法和其Category的load方法

整个事件由dyld主导,完成运行环境的初始化后,配合ImageLoader将二进制文件按格式加载到内存,

动态链接依赖库,并由runtime负责加载成objc定义的结构,所有初始化工作结束后,dyld调用真正的main函数。
值得说明的是,这个过程远比写出来的要复杂,这里只提到了runtime这个分支,还有像GCDXPC等重头的系统库初始化分支没有提及(当然,有缓存机制在,它们也不会玩命初始化),总结起来就是main函数执行之前,系统做了茫茫多的加载和初始化工作,但都被很好的隐藏了,我们无需关心。

当这一切都结束时,dyld会清理现场,将调用栈回归,只剩下main函数

main函数开始:

1.程序执行main()函数;

2.main函数中直接返回的是UIApplicationMain,所以接下来执行UIApplicationMain;

3.根据UIApplicationMain中的第三、第四个参数分别设置UIApplication对象及其代理;第三个参数是UIApplication的类名或者子类名,如果为nil则默认是UIApplication,第四个参数代表代理的类名,该代理负责处理应用程序状态切换过程中所产生的事件;

4.开启循环监听系统事件(Event Loop);

5.此处分有storyboard和没有storyboard两种情况,

 

(1)有stroyboard

   > 应用程创建一个UIWindow对象(继承自UIView),并设置为AppDelegate的window属性。

   > 加载Info.plist文件,读取最主要storyboard文件的名称。

   > 加载最主要的storyboard文件,创建白色箭头所指的控制器对象。并且设置控制器为UIWindow的rootViewController属性(根控制器)。

   > 展示UIWindow,展示之前会将添加rootViewController的view到UIWindow上面(在这一步才会创建控制器的view),其内部会执行该行代码:[window addSubview: window.rootViewControler.view];

 

(2)没有stroyboard

   > 首先会调用delegate对象的application:didFinishLaunchingWithOptions:方法。

   > 在application:didFinishLaunchingWithOptions:方法中需要主动创建 UIWindow对象。并设置为AppDelegate的window属性。

   > 主动创建一个 UIViewController对象,并赋值给window的rootViewController属性。

   > 调用 window的makeKeyAndVisible方法显示窗口。

 

//创建窗口对象          self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];                    //创建主控制器对象(控制器的View是延时加载的,等到用到的时候再用loadView方法加载)          self.HITViewController = [[UIViewController alloc]initWithNibName:@"HITViewController" bundle:nil];                    //设置窗口的根控制器为该主控制器          self.window.rootViewController = self.HITViewController;                    //让窗口成为主窗口并可见          [self.window makeKeyAndVisible];

程序加载的顺序是先在程序中找storyboard,若果没有找到则找相应的xib,若是都没找到并且代理中没有手动添加代码,则默认用代码创建一个黑色的界面;

 

转载于:https://my.oschina.net/rainwz/blog/1830242

你可能感兴趣的文章
mysql的binlog安全删除
查看>>
JSTL+EL-----消灭java的JSP语言(去伪存精版)
查看>>
JAVA设计模式之桥接模式
查看>>
通用虚拟机连接外网配置
查看>>
Cisco TFTP Server实验与操作
查看>>
sshpass 使Linux可以明文参数输入SSH密码
查看>>
sscanf() 函数
查看>>
poj - 1061 青蛙的约会【扩展欧几里】
查看>>
centos redis 主从配置+哨兵模式
查看>>
错题解析
查看>>
二分搜索首次出现被搜索元素的位置
查看>>
oracle密码过期
查看>>
[SDOI2011]染色 BZOJ2243 树链剖分+线段树
查看>>
DNS检测
查看>>
ssl 握手过程【收藏】
查看>>
form表单数据进行json转换
查看>>
Delphi常用取整函数
查看>>
Axis2发布webservice(4)—利用XML文件同时发布多个webservice和跨多个WebService管理Session...
查看>>
Html中空格转义字符
查看>>
TP3.1.3 中的volist分页时怎样实现$i自动增加
查看>>