本文只是整理一些比较常见的性能优化问题

卡顿解决的主要思路

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