美文网首页
iOS App启动流程

iOS App启动流程

作者: conowen | 来源:发表于2018-04-20 14:42 被阅读15次

iOS的App启动一般有两个过程,发生在main函数前的过程和main函数之后的过程。

main函数前

App开始启动后,系统首先加载可执行文件(即App所有.o文件),然后加载动态链接库dyld,dyld是一个专门负责加载动态链接库的库(the dynamic link editor工具),dyld会加载所有可执行文件(.o文件)的依赖动态库,包括App使用到的所有系统 framework,还有一些runtime和系统级别的lib,如libobjc、libSystem等

简单来说,上述所说的可执行文件(.o文件)和动态库都可以称为image。

所有动态链接库、App集成的静态库、所有类文件编译后的.o文件最终都是由dyld这个工具加载到内存中。每个image都是由一个叫做ImageLoader的类来负责加载。

ImageLoader

这里的image并不是代表图片的意思,表示一个二进制文件(可执行文件或 so 文件),里面是被编译过的符号、代码等,所以 ImageLoader 作用是将这些文件加载进内存,且每一个文件对应一个ImageLoader实例来负责加载。

大概流程

1、dyld 开始将程序二进制文件初始化
2、交由 ImageLoader 读取 image,其中包含了我们的类、方法等各种符号
3、由于 runtime 向 dyld 绑定了回调,当 image 加载到内存后,dyld 会通知 runtime 进行处理
4、runtime 接手后调用 mapimages 做解析和处理,接下来 loadimages 中调用 callloadmethods 方法,遍历所有加载进来的 Class,按继承层级依次调用 Class 的 +load 方法和其 Category 的 +load 方法。

至此,可执行文件中和动态库所有的符号(Class,Protocol,Selector,IMP,…)都已经按格式成功加载到内存中,被 runtime 所管理,再这之后,runtime 的那些方法(动态添加 Class、swizzle 等等才能生效)。

简单来说就是
dyld加载各种库---->ImageLoader读取 image ---- >runtime初始化环境

优化

对于main()调用之前的耗时我们可以优化的点有:
1、减少不必要的framework,因为动态链接比较耗时
2、check framework可以优化,如果该framework在当前App支持的所有iOS系统版本都存在,那么就设为optional,否则就设为required,因为required代表强引用,表示一定会加载到内存中,而optional在使用的时候才会加载。
3、合并或者删减一些OC类,关于清理项目中没用到的类。

main函数后

在main()被调用之后,
执行
- (BOOL)Application:(UIApplication *)Application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
然后在这个方法必要的服务,配置第三方库、显示首页内容等。
可以优化的点:
1、尽量使用代码布局UI,避免使用XIB、storyboard。
2、一些在didFinishLaunchingWithOptions的配置或者创建可以使用懒加载,或者延后创建。

参考文章

https://techblog.toutiao.com/2017/01/17/iosspeed/

相关文章

  • iOS App启动优化—— 了解App的启动流程

    iOS App启动优化—— 了解App的启动流程

  • iOS性能优化-APP启动

    前言:本文旨在介绍iOS性能优化中有关APP启动流程的介绍和优化。 一、APP启动流程 1、APP的冷启动流程 点...

  • iOS APP启动流程

    iOS APP启动流程 做ios也有一段时间了,但是app的整个的启动流程还似懂非懂,看了许多的博客和资料,在这里...

  • App启动耗时优化

    1.App启动流程分析 iOS App启动时,系统会调用fork和execve,fork功能创建app进程,exe...

  • iOS App启动流程

    iOS的App启动一般有两个过程,发生在main函数前的过程和main函数之后的过程。 main函数前 App开始...

  • iOS app启动流程

    1.程序入口main函数创建UIApplication实例和UIApplication代理实例。 2.在UIApp...

  • iOS APP启动流程

    1. _dyld_start入口函数 在一个类的+ (void)load函数上打断点,查看此时的堆栈信息如下: 可...

  • iOS App 启动流程

    原文链接 当 App 启动的时候,系统首先会加载 APP 的可执行文件,然后获得 dyld 所在路径,加载 dyl...

  • ios App启动流程

    1.App启动过程 1)解析info.plist 2)加载相关信息,例如闪屏 3)沙盒建立,权限检查 4)Mach...

  • 性能优化:App启动优化

    一、App启动流程及启动优化二、定量监测App启动耗时、定位耗时代码三、果速送App启动优化 一、App启动流程及...

网友评论

      本文标题:iOS App启动流程

      本文链接:https://www.haomeiwen.com/subject/qxqikftx.html