一、耗电优化
少用定时器
-
优化I/O操作
- 尽量不要频繁写入小数据,最好批量一次性写入
- 读写大量重要数据时,考虑用dispatch_io,其提供了基
于GCD的异步操作文件I/O的API。用dispatch_io系统会优化磁盘访问 - 数据量比较大的,建议使用数据库(比如SQLite、CoreData)
-
网络优化
- 如果多次请求的结果是相同的,尽量使用缓存
- 使用断点续传,否则网络不稳定时可能多次传输相同的内容
- 网络不可用时,不要尝试执行网络请求
-
定位优化
- 如果只是需要快速确定用户位置,最好用CLLocationManager的requestLocation方法。定位完成后,会自动让定位硬件断电
- 如果不是导航应用,尽量不要实时更新位置,定位完毕就关掉定位服务
- 尽量降低定位精度,比如尽量不要使用精度最高的kCLLocationAccuracyBest
-
硬件检测优化
- 用户移动、摇晃、倾斜设备时,会产生动作(motion)事件,这些事件由加速度计、陀螺仪、磁力计等硬件检测。在不需要检测的场合,应该及时关闭这些硬件
二、App启动优化
主要分为冷启动和热启动,优化主要是针对热启动的
2.1、打印启动时间
- 通过添加环境变量可以打印出APP的启动时间分析(Edit scheme -> Run -> Arguments)
- DYLD_PRINT_STATISTICS设置为1
2.2、冷启动分为3个阶段
dyld
1、减少动态库、合并一些动态库(定期清理不必要的动态库)
2、减少Objc类、分类的数量、减少Selector数量(定期清理不必要的类、分类)
3、减少C++虚函数数量
4、Swift尽量使用structruntime
1、用+initialize方法和dispatch_once取代所有的attribute((constructor))、C++静态构造器、ObjC的+loadmain
1、在不影响用户体验的前提下,尽可能将一些操作延迟,不要全部都放在finishLaunching方法中
2、按需加载
三、卡顿优化
3.1、CPU优化
- 尽量用轻量级的对象,比如用不到事件处理的地方,可以考虑使用CALayer取代UIView
- 不要频繁地调用UIView的相关属性,比如frame、bounds、transform等属性,尽量减少不必要的修改
- 尽量提前计算好布局,在有需要时一次性调整对应的属性,不要多次修改属性
- Autolayout会比直接设置frame消耗更多的CPU资源
- 图片的size最好刚好跟UIImageView的size保持一致
- 控制一下线程的最大并发数量
- 尽量把耗时的操作放到子线程
1、文本处理(尺寸计算、绘制)
2、图片处理(解码、绘制)
3.2、GPU
尽量避免短时间内大量图片的显示,尽可能将多张图片合成一张进行显示
GPU能处理的最大纹理尺寸是4096x4096,一旦超过这个尺寸,就会占用CPU资源进行处理,所以纹理尽量不要超过这个尺寸
尽量减少视图数量和层次
减少透明的视图(alpha<1),不透明的就设置opaque为YES
尽量避免出现离屏渲染