谈谈我对iOS app从编译到完全启动的流程的理解

2023-05-16

从的来说编译分几个阶段 预处理->代码解析->汇编->链接->生成可执行文件

一、预处理的中进行的操作是:

1、进行宏替换

2、头文件引入  #include/#import 使用对应.h文件的内容替换这一行,所以我们导入头文件应该尽量写在.m文件里面,避免.h文件过于臃肿

3、处理条件编译指令 #if #else  #endif

二、代码解析:包括词法分析,语法分析,静态分析,生成中间代码和优化

1、词法分析:这一步的操作是将代码转换成特殊的标记流、源码被分割成了一个个特殊的字符和单词,在行尾loc都标记了源码所在的对应源文件和行数,方便在具体报错时查找位置。Clang定义的所有Token类型, 可以分为1关键字比如if,else,for,while等;2标识符(变量名);3字面量(值,数字,字符串);4特殊符号(加减加减乘除等符号)

2、语法分析:这一步把语法分析生产的标记流解析生成一个抽象的语法树(abstract syntax tree -- AST),同样地,在这里面每一节点也都标记了其在源码中的位置。

3、静态分析: 源码被转化成抽象树之后,编译器就可以对这个树进行抽象处理,静态分析会对代码进行错误检查,类型检查,如出现方法调用但是未被调用,定义变量但是未被使用,一次提高代码质量

4、中间代码生成和优化,中间代码文件有三种1.text 便于阅读的文本格式,类似于汇编语言,扩展名.ll 2.memory内存格式 3.二进制格式扩展名为.bc;生成中间文件后llvm会对其进行编译优化,例如全局变量优化,循环优化尾递归优化最后输出汇编代码

三、汇编 这一阶段会将生成的可读的汇编代码转换成机器代码,最终产物是以.o为后缀的目标文件会在xcode构建产生的DerivedData文件中看到该文件

四、链接:这一步操作就是将上述生成的目标文件和静态库链接起来最终生成可执行文件,可执行文件的类型是Mach-O类型,iOS和mac电脑的可执行文件都是这种类型,苹果手机的指令集是ARM,模拟器的一般是X86_64,至此编译流程结束。

 

下面我们开始走启动流程(冷启动)

1、解析info.plist文件 加载相关信息,例如闪屏,建立沙盒,检查权限

2、dyld(动态链接器)的装载过程,这个过程中dyld将所有的可执行文件进行装载,同时递归加载所有依赖的动态库,当dyld将所有的可执行文件和动态库装载完毕后会通知runtime执行下一步。

3、runtime调用map_images对可执行文件的内容进行解析和处理,load_images中调用call_load_methods(调用所有class和categary的load方法),初始化各种objc对象结构(注册objc类,初始化类对象等等)

4、runtime调用C++初始化器和attribute修饰的函数,到此为止可执行文件和动态库中所有符号(Class,Protocol,Selector,IMP,…)都已经加载到内存中

5、所有初始化流程结束后就可以执行main函数及以后得操作了,依次是main,UIApplicationMain,didFinishLaunch方法

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

谈谈我对iOS app从编译到完全启动的流程的理解 的相关文章

随机推荐

  • 2022-4-21 vrep深度相机Kinect 远程c++(qtcreator) opencv 保存

    从模型库里拉出来一个Kinect相机放在合适位置 xff1a 设置好像素 xff0c 不是标准像素值vrep有警告 xff08 可能数据有误 xff09 xff0c 忽略即可 同样的像素值 xff0c 在c 43 43 端 xff1a sp
  • 20220905 buffer overflow detected

    hit 64 hit span class token operator span span class token operator span span class token operator span gitprojects span
  • 泉州IT公司名录

    超牌电子有限公司 18259571509 福建泉州超牌电子有限公司成立于1997年 xff0c 是一家自主研发 生产和销售移动电源 xff0c 应急充电器等一系列锂电池为 地址 福建泉州 主营产品 移动电源 虹科安防 18060109697
  • 2023-2-24 pagmo2安装测试

    content 安装必要依赖安装boost安装TBB 安装pagmo 安装必要依赖 安装boost 依赖boost版本大于1 68 boost官网下载 安装boost 安装包解压缩后 span class token punctuation
  • 2023-4-23 Windows和Ubuntu使用网线直连搭建局域网

    1 Windows下的配置 xff1a 右键右下角的网络图标 xff08 或者右键网络 属性 xff09 更改适配器设置 以太网 右键属性 TCP IPv4 IP地址 xff08 192 168 1 3 xff09 子网掩码 xff08 2
  • traj_out variable ‘std:ofstream’ has initializer but incomplete type

    variable 39 std ofstream has initializer but incomplete type 或者是variable 39 std ifstream has initializer but incomplete
  • perl处理excelwenjian

    usr bin perl use strict use Win32 OLE qw in with use Win32 OLE Const 39 Microsoft Excel 39 Win32 OLE Warn 61 3 die on er
  • C++ox 之 lambda

    http www cnblogs com allenlooplee archive 2012 07 03 2574119 html 今天看了博文 xff0c 之前对于lambda的理解比较粗陋 xff0c 今天再学习一下 不得不说我是一个极
  • __x_a != __x_a什么时候不成立?

    define isnan x extension typeof x x a 61 x builtin expect x a 61 x a 0 在看redis源码的时候发现了一个有趣的东西 xff0c 这个宏对是否是有效的实数进行了判断 这个
  • pthread_mutex_trylock的问题及解决

    在需要使用非阻塞的锁时 xff0c trylock是一个比较好的选择 xff0c 但是使用的时候碰见了一些问题 xff1a 需要使用PTHREAD MUTEX ERRORCHECK NP 来定义一个检错锁 xff0c 但是不管如何都编译不过
  • thrift, Protocol Buffers and MsgPack 的序列化对比

    啥是序列化 xff1f 序列化是将对象状态转换为可保持或传输的格式的过程 与序列化相对的是反序列化 xff0c 它将流转换为对象 这两个过程结合起来 xff0c 可以轻松地存储和传输数据 为啥要序列化 xff1f 1 以某种存储形式使自定义
  • python处理xlsx

    一 读取excel 这里介绍一个不错的包xlrs 可以工作在任何平台 这也就意味着你可以在Linux下读取Excel文件 首先 xff0c 打开workbook xff1b import xlrd wb 61 xlrd open workb
  • php解析请求url并返回json数据

    lt php paserRequest SERVER 34 QUERY STRING 34 function paserRequest strReq parse str strReq 解析请求参数 cpIds 61 explode 39 3
  • 对TTL电平,232电平 CMOS电平做下总结

    xff08 一 xff09 TTL电平标准 输出 L xff1a lt 0 8V xff1b H xff1a gt 2 4V 输入 L xff1a lt 1 2V xff1b H xff1a gt 2 0V TTL器件输出低电平要小于0 8
  • twemproxy for redis使用说明及简单分析

    redis的数据量在内存高过50G时系统出现了明显的瓶颈 为了解决这个问题 xff0c 笔者找了些相关的资料 xff0c 发现了这个开源软件 功能很强大 xff0c 包含了last fm的ketama的一致性hash算法 xff0c 对于笔
  • static的map成员的初始化顺序居然和编译器相关

    我十分不敢相信这是真的 xff0c 但是确实发生了 xff0c 而且足足折腾了我5个小时 core文件的内容大概是这样 xff1a 0 0x0000003071664cba in std Rb tree decrement std Rb t
  • 创建在mac电脑本地搭建nginx,并模拟打包发布前端构建包

    1 本地安装nginx服务brew install nginx 报No such file or directory 64 rb sysopen Users wangjie Library Caches Homebrew downloads
  • 关于swiftUI和UIKit混用

    思路无非就是自定义一个结构体view实现UIViewRepresentable协议 xff0c 然后就可以作为一个swiftUI组件进行调用了 1 我们要定义一个CustomView这个名字随便起 struct CustomView UIV
  • swiftUI自定义Environment的Key

    1 创建一个结构体作为要共享的值 struct RefreshData var thresold CGFloat 61 0 var progress Double 61 0 var refreshState RefreshState 61
  • 谈谈我对iOS app从编译到完全启动的流程的理解

    从的来说编译分几个阶段 预处理 gt 代码解析 gt 汇编 gt 链接 gt 生成可执行文件 一 预处理的中进行的操作是 1 进行宏替换 2 头文件引入 include import 使用对应 h文件的内容替换这一行 xff0c 所以我们导