app启动
app启动分为两种:冷启动和热启动(冷启动就是App被重新打开,热启动就是从后台到前台,启动优化主要是针对冷启动的)
app启动时间分为两部分:main函数执行前(pre-main)、main函数至启动完成(main)
添加环境变量查看main函数启动时间
添加环境变量:DYLD_PRINT_STATISTICS,设置value为1(也可以通过设置DYLD_PRINT_STATISTICS_DETAILS为1获得系统在调用main 函数之前主要工作占用的时间信息.)
image.png
冷启动主要包含以下几个阶段:
- dyld加载:加载动态库。加载完成后会通知runtime进行下一步操作;
- runtime初始化:在分析Category、load、initialize的加载原理中有分析过runtime的加载流程:map_images开始加载所有的方法、协议、分类、然后load_images去调用所有的load方法,当所有的可执行文件和所有的符号(IMP/SEL/Class/Protocol/Category等)都已经按照runtime的格式加载完毕后,开始调用main函数;
- 调用main函数,然后去调用UIApplicationMain,再到AppDelegate的didFinishLanchingWithOptions:方法
文章推荐:
iOS Dynamic Framework 对App启动时间影响实测
优化步骤:
- 减少动态库,合并动态库(动态库定期清理);
- 合并一些类,减少Objc类、分类的数量,减少SEL的数量;
- 耗时操作不要放在didFinishLanchingWithOptions:中
内存检测
MLeaksFinder:运行app,当离开视图页面时,如果该页面视图控制图/其中的视图存在内存泄漏时,会弹出「Memory Leak」警告框,展示存在内存泄漏问题的相关视图控制器/视图堆栈信息:
下载地址: https://github.com/Zepo/MLeaksFinder
IPA瘦身
LinkMap:可以查看每一个类在打包后的大小,按需进行优化
下载地址:https://github.com/huanxsd/LinkMap
使用方法就不做介绍了,很简单。效果如下:
图片压缩
https://tinypng.com
LSUnusedResources:检测未使用到的一些资源文件
下载地址:https://github.com/tinymind/LSUnusedResources
使用方法同样很简单,可以自己定义一些过滤条件,具体可以跑一个看看。效果如下:
卡顿处理
一些基础的卡顿处理,如tableview的cell优化、高度缓存、frame提前计算等等就不做具体的介绍了。
FPS卡顿检测:判断当前UI帧率
基本原理就是利用一个CADisplayLink定时器进行计数,1s执行的次数就是当前的帧率
下载地址:https://github.com/wsl2ls/WSL_FPS
运行效果如下:
YYKit异步渲染:YYAsyncLayer
渲染就是把我们代码里设置的代码的视图和数据结合,最后绘制成一张图呈现在用户的面前。每秒绘制60张图,用户看着就是流畅的,如果不到60帧,那么越少用户看着就会越卡。
引用一个别人写的对YYAsyncLayer的源码分析:YYAsyncLayer 源码剖析:异步绘制
网友评论