针对于iOS的性能优化,主要分为几个部分。物理方面:APP瘦身,电量优化。体验方面:APP启动优化,界面优化,内存泄漏优化。
1.APP瘦身
安装包是由可执行文件和资源组成的。
针对资源的优化:
1.1.0对资源采取无损压缩。
1.1.1去除没有用到的资源。
可执行文件的优化
1.2.0 编译器优化,去掉一些用不到的支持。比如Enable C++ Exceptions、Enable Objective-C Exceptions设置为NO, Other C Flags添加-fno-exceptions。
1.2.1 利用AppCode检查没有使用到的代码
1.2.2 检查重复代码
2.电量优化
尽可能降低CPU,GPU功耗
少用定时器
优化I/O操作
尽量不要频繁写入数据,最好批量写入
定位优化:
如果只是确定用户位置,确认好位置之后,关闭定位。
除非要实时导航,不然要尽早关闭定位服务
除非对位置有高精度要求,不然不要设置最高精度的定位
后台定位的时候,尽量设置成用户不太可能移动的时候系统自动暂停更新位置的模式
还有一些比如加速度计,陀螺仪,磁力计这些硬件不必要的话关闭它,如果需要使用完了也要早点关闭,节省电量
3.APP启动优化
APP启动分为热启动和冷启动。这里的启动优化主要针对于冷启动
启动的时间分为main函数之前的时间t1和main函数之后的时间t2
main函数之前首先是info.plist的加载
1.加载相关信息,例如闪屏等
2.沙箱建立,权限检查
然后是mach_o文件的加载
1.如果是胖二进制文件,寻找合适当前CPU的部分
2.加载所有的依赖mach_o文件。
3.定位内外的指针引用,例如字符串函数等
4.加载c++的构造函数
5.加载分类中的方法
6.c++静态变量的加载和load函数的加载
main函数之后主要是Appdelegate和首页的逻辑优化
针对上面的t1和t2,我们都可以进行一些优化
t1:1.减少动态库的使用或者通过静态库来代替加快dyld的连接过程
2.如果确认用到的动态库设置成required,不确定的设置成optional
3.压缩图片资源
4.减少一些OC的类或者合并一些OC的类
5.减少C++的构造函数
6.减少分类
7.减少load函数或者优化load函数的逻辑,如果可以的话,把他的逻辑放到initialize方法里面
t2:1. 不影响用户体验的操作,做延迟加载,不要全部放在 didFinishLaunchingWithOptions中去做
2. 版本更新,一些三方初始化,不需要在 didFinishLaunchingWithOptions 初始化的放到,界面展示完以后再初始化
3. 一些网络请求延迟 ,一些业务逻辑延迟 加载 , 初始化第三方 SDK ,配置 APP 运行需要的环境 自己的一些工具类的初始化这些逻辑如果可以的话,延迟加载初始化
4.界面优化
1.界面优化主要是针对CPU和GPU的
CPU的主要工作是对象的创建和销毁,对象属性的调整,布局计算,文本的计算和排版,图片格式的转换和解码,图形的绘制等工作
GPU的工作是纹理的渲染合成等
尽量使用轻量级的对象,比如不需要点击时间的地方可以考虑Calayer代替UIView
不要频繁的调用UIView的相关属性,比如frame,bounds,transform等属性。尽量减少不必要的修改
提前计算好布局,在需要的时候一次性的调整对应的属性,不要多次修改
自动布局比使用frame更消耗CPU资源
图片的size最好和imageView保持一致
控制一下线程并发量
尽量避免短时间内的大量图片显示
减少视图层级和层次
减少透明的视图
尽量把耗时的操作放在子线程
防止离屏渲染:
离屏渲染在指的是在当前屏幕缓冲区之外新开辟一个屏幕缓冲区进行渲染
为什么要防止离屏渲染:
它会很影响GPU的渲染性能的:他需要创建新的屏幕缓冲区,渲染的过程中,需要多次切换上下文。他会先从当前上下文切换到离屏,然后在渲染结束后,将渲染结果传到当前屏幕,最后从离屏切换到当前屏幕
那些操作会影响离屏渲染
1.圆角
masktobounds = yes和layer.coradis>0同时使用
2.阴影
3.光栅化
4.遮罩
5.内存泄漏
在代码层面,我们要有一个良好的编码习惯。代码要规范。但是有的时候有些错误也是可能会有的。我们也可以通过工作去检测的。
常规的检测方法:
Analyze静态分析
它主要分析四种问题:
1.访问空指针或者未初始化的变量等
2.内存管理错误:内存泄漏
3.声明错误:从未使用的变量
4.API调用错误:未包含使用的库和框架
静态分析都会有提示的
leak工具动态分析内存泄漏,可以定位到具体的代码位置
allocation工具可以查看内存的分配情况
memory可以实时监测内存占用情况