iOS性能优化思路

运行速度(静态检测-Analyze、运行时检测-Profile)

表现形式页面流畅度。本质上是降低CPU、GPU的消耗。CPU复杂逻辑运算,包括对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解码、图像的绘制;GPU是由多个小单元运算器组成的高并发运算器,负责纹理的渲染。

CPU相关优化
  • 轻量级对象代替复杂对象(如CALayer替代UIView);
  • 缓存,空间换时间(缓存布局、缓存图片、缓存重复使用的对象、字体和时间格式)imageWithName和imageWithContentOfFile;
  • 选择合适的数据结构和算法(包括本地数据结构和服务端数据结构统一,减少多余的转换);
  • 提前计算好布局,在需要时一次修改,不要多次修改
  • 图片的size最好刚好跟UIimageView的size保持一致
  • 控制线程的最大并发数量
  • 减少IO操作,子线程进行;
  • 延时加载,需要用到的时候再创建;
  • 启动速度优化(启动时间-Time Profile );
  • 减轻主线程压力(文本尺寸计算和绘制,图片解码和绘制)
GPU相关优化
  • 减少视图数量和层次(合成视图或者异步绘制成一张图片);
  • CPU能处理的最大纹理尺寸是4096x4096,一旦超过这个尺寸,就会占用CPU资源进行处理,所以纹理尽量不要超过这个尺寸
    尽量减少短时间内显示大量的图片,可合成一张图片
  • 减少透明视图
  • 离屏渲染 圆角、光栅化;
  • 使用了 mask 的 layer (layer.mask)
  • 需要进行裁剪的 layer (layer.masksToBounds / view.clipsToBounds)(贝塞尔曲线UIBezierPath、直接切一个带有圆角的图片等)
  • 设置了组透明度为 YES,并且透明度不为 1 的 layer (layer.allowsGroupOpacity/ layer.opacity)
  • 添加了投影的 layer (layer.shadow*)
  • 采用了光栅化的 layer (layer.shouldRasterize)
  • 绘制了文字的 layer (UILabel, CATextLayer, Core Text 等)

消耗内存

  • 图片压缩(本地图片压缩、网络图片压缩,根据展示大小压缩、缩略图)
  • 减少不比较的缓存,缓存模块要有清理机制
  • 适当地使用AutoreleasePool
  • 防止内存泄露(NSTimer、Block)

Memory Leaks
Allocations
Analyse
MLeaksFinder

消耗电量

  • CPU和GPU(尽可能降低功耗)
  • 定位(快速确定位置用requestLocation,完成后定位器自动断点、适当关闭、降低精度)
  • 定时器(适时关闭)
  • 网络请求(无网时不请求)
  • Io操作(避免频繁操作,累计一次进行操作)
  • 硬件检测优化

网络请求

  • 减少网络数据(压缩 XML>JSON>ProtoBuf)
  • 合并请求
  • 合理利用缓存
  • 增量更新(时间戳etag、lastUpdate)
  • 断线续传
  • 检测网络状态,网络不可用时不尝试进行请求
  • 提供取消网络请求的操作,避免长时间的网络请求
  • 提供批量传输。下载资源时尽量一次下载尽可能多的资源

运行稳定性

  • 野指针,僵尸对象检查(对象被释放、指针未置空则为野指针,指针指向为僵尸对象)
  • 线程安全(线程安全接口、可编辑类、同步、锁)
  • 通知、KVC&KVO
  • NSTimer target被release了
  • 内存监测
  • 主线程卡顿检测

包大小优化

  • 编译器优化(多余符号、C++异常等)
  • AppCode检测未使用代码,去除
  • 编写LLVM插件检测出重复代码、未被调用的代码
  • 图片、音频、视频压缩
  • 去除没有用到的资源