问: 简述一下iOS的App冷启动过程.
-
阶段1:
dyld
(dynamic link editor) ,dyld 是iOS的动态链接器, 可以用来装载Mach-O文件.
- 装载App的可执行文件,同时递归装载所有依赖的动态库.
- 当dyld装载完成之后,就会通知Runtime执行下一步操作.
-
阶段2:
Runtime
可执行文件和动态库中所有的符号(Class,Protocol, Seletor, IMP ...) 都按照格式加载到内存中,被Runtime所管理.
Runtime在App启动时主要工作有以下内容:
- 调用
map_images
进行可执行文件内容的解析与处理. - 在load_images中会调用
call_load_methods
, 调用所有Class和Category的load方法. - 进行各种objc结构的初始化(注册Ojbc类、初始化类对象等).
- 调用C++的静态初始化器和
__attribute__(constructor)
修饰的函数.
- 调用
-
阶段3:
main
所有初始化工作完成之后dyld就会调用main函数.
main函数就会调用UIApplicationMain函数,Appdelegate中得
application: didFinishLaunchingWithOptions:
问: 简述一下iOS的App冷启动优化.
-
dyld阶段
- 减少动态库、动态合并清理动态库.
- 减少Objc类、Catagory类、减少Selector的数量(定时清理)
- 减少C++虚函数的数量
-
runtime
- 尽量使用initialize方法和dispatch_once取代所有的C++的静态初始化器和
__attribute__(constructor)
以及Load方法.
- 尽量使用initialize方法和dispatch_once取代所有的C++的静态初始化器和
-
main
- 在
application: didFinishLaunchingWithOptions:
尽量不要做一些延时操作.
- 在
问: 简述一下iOS的App包体积优化.
- 定期清理图片资源.(推荐)
- 减少静态库
- 定期清理不需要的类.
Comments | 0 条评论