1. APP启动流程
graph TD
APP启动 -->
冷启动 --> 解析Info.plist --> 加载信息如启动页等 --> 沙箱建立,权限检查
冷启动 --> dyld加载mach-o文件 --> 预编译 --> 编译 --> 汇编 --> 链接 -->静态链接
链接 -->动态链接
动态链接 -->递归加载所有的动态库
静态链接 -->递归加载所有的动态库
递归加载所有的动态库 --> rebase和binding
冷启动 --> runtime
runtime --> OC类的注册 --> selecter的唯一性检测 --> C++静态对象,OC的+load函数
冷启动 --> main函数初始化
冷启动 --> exec函数开始 -->创建进程 --> 分配内存空间
冷启动 --> pre-main
冷启动 --> main --> UIApplicationMain --> applicationWillFinishLaunching
APP启动 --> 热启动
2. 如何测量启动过程耗时
苹果提供的方法
在Xcode的菜单中选择Project→Scheme→Edit Scheme...,然后找到 Run → Environment Variables →+,添加name为DYLD_PRINT_STATISTICS的value值为1的环境变量。
解读
- main()函数之前总共使用了990.87ms
- 在990.87ms中,
- 加载动态库用了487.47ms,
- 内外部指针定位使用了50.86ms,
- ObjC类初始化使用了85.73ms,
- 各种初始化使用了366.80ms。
- 在初始化中,用时最多的三个初始化是libSystem.B.dylib、AFNetworking以及yujiancaijing。
main()函数之后
从main()函数开始至applicationWillFinishLaunching方法结束
main()之前影响启动性能的主要因素
- 动态库加载越多,启动越慢。
- ObjC类越多,启动越慢
- ObjC的+load越多,启动越慢
main()函数之后耗时的影响因素
- 执行main()函数的耗时
- 执行applicationWillFinishLaunching的耗时
- rootViewController及其childViewController的加载、view及其subviews的加载
iOSAPP的启动时间
- 应该在400ms内完成main()函数之前的加载
- 整体过程耗时不能超过20秒,否则系统会kill掉进程,App启动失败
启动过程分为四个部分:
- main()函数之前
- 移除不必要的动态的,一个项目动态库最好不要超过6个
- 移除无用的类,无用的方法
- 合并功能类似的类和扩展(Category)
- 清空项目中不必要的图片资源,适当压缩图片资源
- main()函数之后至application:didFinishLaunching完成
- didFinishLaunching中不必要的三方库延迟注册
- 减少或者延迟加载rootViewController中不必要的childViewController和减少视图绘制
- App完成所有本地数据的加载并将相应的信息展示给用户
- 缓存数据到本地
- App完成所有联网数据的加载并将相应的信息展示给用户
- 对传输的数据进行压缩,减少传输的数据
- 使用缓存手段减少请求的发起次数
- 使用策略来减少请求的发起次数,比如在上一个请求未着地之前,不进行新的请求,VC销毁是停止不必要的请求
- 避免网络抖动,提供重发机制
APP性能优化可以从一下几个方面入手
0.启动优化
1.网路优化
2.UI优化
卡顿优化
离屏渲染的优化
3.存储优化
4.包体积优化
5.崩溃优化
6.内存优化
复制代码
检测内存泄漏的一些方法
1.静态检测(手动,自动)
2.动态检测
3.析构函数打印
4.instruments
5.三方检测工具
6.打开僵尸对象检测
复制代码