app性能优化

285 阅读2分钟

#app启动 app启动分为两种:冷启动和热启动(冷启动就是App被重新打开,热启动就是从后台到前台,启动优化主要是针对冷启动的) app启动时间分为两部分:main函数执行前(pre-main)、main函数至启动完成(main)

添加环境变量查看main函数启动时间 添加环境变量:DYLD_PRINT_STATISTICS,设置value为1(也可以通过设置DYLD_PRINT_STATISTICS_DETAILS为1获得系统在调用main 函数之前主要工作占用的时间信息.)

image.png
image.png

冷启动主要包含以下几个阶段:

  1. dyld加载:加载动态库。加载完成后会通知runtime进行下一步操作;
  2. runtime初始化:在分析Category、load、initialize的加载原理中有分析过runtime的加载流程:map_images开始加载所有的方法、协议、分类、然后load_images去调用所有的load方法,当所有的可执行文件和所有的符号(IMP/SEL/Class/Protocol/Category等)都已经按照runtime的格式加载完毕后,开始调用main函数;
  3. 调用main函数,然后去调用UIApplicationMain,再到AppDelegate的didFinishLanchingWithOptions:方法

文章推荐: iOS Dynamic Framework 对App启动时间影响实测

优化步骤:

  1. 减少动态库,合并动态库(动态库定期清理);
  2. 合并一些类,减少Objc类、分类的数量,减少SEL的数量;
  3. 耗时操作不要放在didFinishLanchingWithOptions:中

#内存检测 MLeaksFinder:运行app,当离开视图页面时,如果该页面视图控制图/其中的视图存在内存泄漏时,会弹出「Memory Leak」警告框,展示存在内存泄漏问题的相关视图控制器/视图堆栈信息: 下载地址: github.com/Zepo/MLeaks…

#IPA瘦身 LinkMap:可以查看每一个类在打包后的大小,按需进行优化 下载地址:github.com/huanxsd/Lin… 使用方法就不做介绍了,很简单。效果如下:

image.png

图片压缩 tinypng.com

LSUnusedResources:检测未使用到的一些资源文件 下载地址:github.com/tinymind/LS… 使用方法同样很简单,可以自己定义一些过滤条件,具体可以跑一个看看。效果如下:

image.png

#卡顿处理 一些基础的卡顿处理,如tableview的cell优化、高度缓存、frame提前计算等等就不做具体的介绍了。 FPS卡顿检测:判断当前UI帧率 基本原理就是利用一个CADisplayLink定时器进行计数,1s执行的次数就是当前的帧率 下载地址:github.com/wsl2ls/WSL_… 运行效果如下:

image.png

YYKit异步渲染:YYAsyncLayer 渲染就是把我们代码里设置的代码的视图和数据结合,最后绘制成一张图呈现在用户的面前。每秒绘制60张图,用户看着就是流畅的,如果不到60帧,那么越少用户看着就会越卡。 引用一个别人写的对YYAsyncLayer的源码分析:YYAsyncLayer 源码剖析:异步绘制