本文只是整理一些比较常见的性能优化问题
卡顿解决的主要思路
1.尽量减少CPU和GPU资源消耗
2.尽量用轻量级的对象,比如用不到事件处理的地方,可以考虑使用CALayer取代UIView
3.不要频繁地调用UIView的相关属性,比如frame、bounds、transform等属性,尽量减少不必要的修改
4.Autolayout会比直接设置frame消耗更多的CPU资源
5.图片的size最好刚好跟UIImageView的size保持一致
6.尽量把耗时的操作放到子线程
7.尽量减少视图数量和层次
8.减少透明的视图(alpha<1),不透明的就设置opaque为YES
9.尽量避免出现离屏渲染
离屏渲染消耗性能的原因
- 需要创建新的缓冲区;离屏渲染的整个过程,需要多次切换上下文环境,先是从当前屏幕(On-Screen)切换到离屏(Off-Screen);等到离屏渲染结束以后,将离屏缓冲区的渲染结果显示到屏幕上,又需要将上下文环境从离屏切换到当前屏幕
- 哪些操作会触发离屏渲染?
- 光栅化,layer.shouldRasterize = YES
- 遮罩,layer.mask
- 圆角,同时设置layer.masksToBounds = YES、layer.cornerRadius大于0(考虑通过CoreGraphics绘制裁剪圆角,或者叫美工提供圆角图片)
- 阴影,layer.shadowXXX (如果设置了layer.shadowPath就不会产生离屏渲染)
耗电问题
原因一般有:CPU处理,网络请求,定位,图片加载
优化方法:
- 尽可能降低CPU、GPU功耗
- 少用定时器
- 优化I/O操作
- 尽量不要频繁写入小数据,最好批量一次性写入
- 读写大量重要数据时,考虑用dispatch_io,其提供了基于GCD的异步操作文件I/O的API。用dispatch_io系统会优化磁盘访问
- 数据量比较大的,建议使用数据库(比如SQLite、CoreData)
APP启动
- APP的启动可以分为2种
- 冷启动(Cold Launch):从零开始启动APP
- 热启动(Warm Launch):APP已经在内存中,在后台存活着,再次点击图标启动APP
APP启动时间的优化,主要是针对冷启动进行优化
通过添加环境变量可以打印出APP的启动时间分析(Edit scheme -> Run -> Arguments)
DYLD_PRINT_STATISTICS设置为1
如果需要更详细的信息,那就将DYLD_PRINT_STATISTICS_DETAILS设置为1