美文网首页
iOS 应用程序加载

iOS 应用程序加载

作者: H丶ym | 来源:发表于2021-01-19 14:00 被阅读0次

编译过程

前段

  1. 预处理编译阶段:宏的替换,头文件的导入
  2. 编译阶段:进行词法、语法等的分析和检查,然后生成中间代码IR,产生.i文件
    后端
    3.生成汇编代码
  3. 生成目标文件:将汇编文件转文机器码文件,产生.o文件
  4. 链接:对.0文件中引用其它库的地方进行引用,生成最后的可执行文件(mach-o)
    mach-o文件由四部分组成:mach-o头部,load command,section,other data
    6.绑定:绑定主要是通过不同的架构,生成对应的mach-o格式可执行文件

静态库

在链接阶段,会将可汇编生成的目标程序与引用的库一起链接打包到可执行文件当中。此时静态库不再变化,本质是拷贝一份到目标程序里。有.a、.lib、.framework等
优势:编译后,目标程序没有外部依赖,自己就可以运行
缺点:由于是拷贝,会导致目标程序体积大,静态库被改变,程序需要重新编译

动态库

程序编译时不会链接到目标程序中,目标程序只存储指向动态库的引用,在运行时才会被载入。比如系统的UIKit,APP的动态库是写入app main bundle根目录中,运行在沙盒中
优势:

  • 减少打包之后的app大小
  • 共享内存,节约资源,同一份库可以被多个程序使用
  • 通过更新动态库,达到更新程序的目的:由于运行时才被载入的特性,可以随时对库进行替换,不许要重新编译代码
    缺点:动态载入会带来一部份性能损失,使用动态库需要依赖外部环境,比如版本号等

dyld

dyld(the dynamic link editor) 是苹果的动态链接器,是苹果操作系统的重要组成部分,在app被编译打包成可执行文件格式的mach-o文件后,交给dyld负责连接,加载程序
大致流程如下:

  1. 设置环境变量
  2. 加载共享缓存
  3. 实例化主程序:ImageLoader对象, 这里的image理解为映像
  4. 加载动态库:加载 DYLD_INSERT_LIBRARIES环境变量 指定的库
  5. 链接主程序
  6. 链接动态库
  7. 执行弱符号绑定
  8. 执行初始化方法(objc_init):这里会调用map_image(映射镜像) load_images方法,所有的load方法
  9. 寻找main入口

环境变量配置

在 target -- Edit Scheme -- Run --Arguments -- Environment Variables 配置

DYLD_PRINT_STATISTICS:设置 DYLD_PRINT_STATISTICS 为YES,控制台就会打印 App 的加载时长,包括整体加载时长和动态库加载时长,即main函数之前的启动时间(查看pre-main耗时),可以通过设置了解其耗时部分,并对其进行启动优化

OBJC_DISABLE_NONPOINTER_ISA:杜绝生成相应的nonpointer isa(nonpointer isa指针地址 末尾为1 ),生成的都是普通的isa

OBJC_PRINT_LOAD_METHODS:打印 Class 及 Category 的 + (void)load 方法的调用信息

NSDoubleLocalizedStrings:项目做国际化本地化(Localized)的时候是一个挺耗时的工作,想要检测国际化翻译好的语言文字UI会变成什么样子,可以指定这个启动项。可以设置 NSDoubleLocalizedStrings 为YES。

NSShowNonLocalizedStrings:在完成国际化的时候,偶尔会有一些字符串没有做本地化,这时就可以设置NSShowNonLocalizedStrings 为YES,所有没有被本地化的字符串全都会变成大写。

0x8badf00d 通常是用用花费太多时间而无法启动、终止或响应系统事件
0xbad2222 VoIP 应用因为过于频繁重启而被终止
0xdead10cc: 因为在后台运行时占用系统资源
0xdeadfa11强制退出,发生在用户长按开关按钮,出现“滑动关机”,然后长按Home按钮,导致强制退出,app崩溃,大多数是因为应用阻塞了界面

相关文章

  • 应用程序的加载分析

    应用程序的加载分析 作为一个开发者,对于iOS应用程序启动过程有很多疑问,本篇就应用程序是如何加载的,做相关分析 ...

  • iOS类的加载

    一,应用程序加载回顾 通过前面的学习我们对iOS应用程序的加载有了一个大致的认识, 1 系统调用exec() 会让...

  • iOS 应用程序加载

    1. 理论基础速成 1.1 静态库与动态库 库是已写好的、供使用的 可复用代码,每个程序都要依赖很多基础的底层库。...

  • iOS 应用程序加载

    编译过程 前段 预处理编译阶段:宏的替换,头文件的导入 编译阶段:进行词法、语法等的分析和检查,然后生成中间代码I...

  • iOS应用程序加载

    在main()函数之前,在一般情况下,我们都会将main()函数作为程序入口,在main函数之前,程序所经历的事情...

  • iOS底层之类的加载

    在iOS底层中,关于类的加载,在应用程序开始加载时,首先通过dyld链接到动态库objc,从objc中的init方...

  • iOS objc源码学习

    iOS应用程序的加载(一)[https://www.jianshu.com/p/0be286cc29d6]WWDC...

  • iOS应用程序的加载(二)

    前篇iOS应用程序的加载(一) [https://www.jianshu.com/p/0be286cc29d6] ...

  • iOS应用程序加载流程

    前言 我们都知道,每个项目都会有一个入口 main() 函数,是不是应用程序加载时第一个调用的就是 main 函数...

  • iOS 类的加载

    在 iOS 应用程序加载[https://www.jianshu.com/p/bffb5bdb4f13] 一篇,我...

网友评论

      本文标题:iOS 应用程序加载

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