返回上级目录:iOS面试专题一
1.冷启动分为两个阶段:main函数之前和之后
iOS App冷启动优化 - 知乎
2.pre-main阶段
Pre-main阶段,当用户点击App冷启动,系统会做好准备工作,剩余的工作由DYLD动态链接器完成,称为pre-main。在iOS15/macOS12以前,可以通过添加run启动参数arguments DYLD_PRINT_STATISTICS打印启动时间,以后要靠自己的工具类或者timeProfile Pre-main工作: 1.设置运行环境/环境变量 2.加载共享缓存// iOS特性,从iOS3.1开始,会把系统的动态库抽取出来,如UIKIT,WEBKIT,大大减小app消耗内存 3.实例化主程序 4.加载需要的动态库,根据DYLD_INSERT_LIBRARIES判断 5.链接主程序,rebase()因为从iOS4.3开始使用了ASLR,需要重新定位主程序,bind()对程序二进制和符号表进行绑定 6.链接插入的动态库 7.弱符号绑定 8执行初始化方法,执行所有load方法,这是可以优化的地方 9.查找入口点,执行并返回
2.1 Load dylibs image:加载动态库
针对这一步的优化:减少非系统库的依赖
2.2 Rebase/Bind image:指针重定位
- ASLR(address space layout randomization): 地址空间布局随机化
- 镜像(Mirroring): 是一种文件存储形式,是冗余的一种类型,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像
针对这一步的优化:减少Objc类数量,减少selector数量
2.3 Objc setup:Objc类初始化
这阶段做的事情
- 读取二进制文件的DATA段的内容,找到与objc相关的信息
- 注册Objc类
- 确保selector的唯一性
- 读取protocol以及category的信息
2.4 initializers:各种初始化
load_images
针对这一步的优化:懒加载
pre-main阶段具体优化
-
2.+load方法处理 -
3.针对减少不必要的库 -
4.合并功能类似的类和扩展(Category) -
5.压缩资源图片
3.main()函数之后
- swift中不能重写load和initialize方法
mach-O是苹果系统的可执行文件。一般静态库会被集成到主程序的mach-O之中,动态库会被拷贝到BUndle里的framework文件夹中,一般在启动的时候加载,说到启动,就不得不提启动优化了
我的另外的相关博客: iOS swift中的main函数 iOS 性能优化(一):Improving Your App‘s Performance
参考博客: iOS 性能优化:优化 App 启动速度 - CSDN
ios启动优化:二进制重排
|