iOS App冷启动优化:Before Main阶段

iOS应用冷启动时,在 UIApplicationMain(argc, argv, nil, appDelegateClassName)方法执行前,主要经历以下阶段:

  1. 执行exec()启动应用程序进程

  2. 加载可执行文件,即将应用程序的Mach-O文件加载到内存

  3. 加载Dyld:加载应用程序依赖的动态库

  4. Dyld加载其他动态库,分析动态库的依赖,并递归加载其他动态库

  5. Rebase:根据动态库加载的随机地址+符号偏移,为镜像中的符号生成真实的指针地址

  6. Bind:查询符号表,确定镜像中依赖的外部符号的内存地址

  7. Objc: 即注册OC类、协议, 以及将category中的方法添加到方法列表

8.Initalizers:执行OC类的load方法,以及执行C++类的构造方法,C++初始化全局、静态对象。

由此可知, 在应用程序启动时,

  1. 动态库加载越多,启动越慢。

  2. ObjC类方法越多,启动越慢。

  3. ObjC的+load方法越多,启动越慢。

  4. C的constructor函数越多,启动越慢。

  5. C++静态对象越多,启动越慢。

优化策略:

  1. 减少动态库数量

  2. 删除无用的类或类中无用的方法,合并category,避免静态全局变量大量使用

  3. 尽量不重写类的load方法,以便尽可能使符号采用懒加载

  4. 避免在load方法中执行耗时操作,或者使用异步或多线程

  5. 减少使用xib进行页面布局,减少布局转换耗时

  6. 通过二进制重排,减少内存页加载

method-swizzling改在initialize方法中虽然可以提升部分性能,但应十分谨慎。因为一旦category中实现了initialize方法,当前类的initialize会被覆盖,即可能不会执行,进而可以导致意料之外的严重问题

相关推荐
YIAN12 分钟前
Docker + Nginx 核心原理扫盲:从环境隔离到反向代理,运维面试必考点
后端·docker·面试
SameX36 分钟前
iOS 独立开发者转鸿蒙:我把足迹地图 App 迁移到 ArkTS 的全过程
ios
蒸蒸yyyyzwd2 小时前
cpp 选手秋招学习笔记 day21
c++·面试·八股
黄敬峰2 小时前
一文搞懂宝塔面板部署前后端分离项目(React + Node.js + MySQL)
面试
Interview Aid1122 小时前
TikTok OA 四题分享|半小时内 AC,题目基本都是实现题
java·开发语言·算法·面试·职场和发展
怕浪猫11 小时前
FDE 最大的浪费不是写出有 bug 的代码,而是漂亮地解决了一个错误的问题
面试·架构·github
黄敬峰13 小时前
Next.js 全栈实战:数据清洗、ORM 设计与 AI Prompt 工程最佳实践
面试·github
sakiko_15 小时前
Swift学习笔记42-SwiftUI的属性包装器(讲解+面试)
笔记·学习·ios·swiftui·swift
雨夜之寂17 小时前
雨夜-现在有办法识别是不是ai文章么
后端·面试
不正经学生19 小时前
C语言动态内存管理(上):堆上的自由与责任
c语言·开发语言·c++·算法·面试