运行速度(静态检测-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插件检测出重复代码、未被调用的代码
- 图片、音频、视频压缩
- 去除没有用到的资源