1、 网络方面的优化
- 请求前判断网络状态,网络不可用,不要尝试执行网络请求;
- 请求前设置合适的超时时间,避免长时间运行或者速度很慢的网络操作;
- 请求过程尽量使用断点续传,否则网络不稳定的时候可能多次传输相同的内容;
- 减少、压缩网络数据;
- 请求结果使用缓存;
- 网络活动会唤起需要长时间周期性供电的无线电模组,可以分批次进行网络请求,来降低开销;
2、 定位优化
- 精密&高频的的定位会增加开销,需要按需使用;
- 如果不是导航的应用,尽量不要实时更新位置,定位完毕就关掉定位服务;
- 如果只是需要快速确定用户的位置,最好用CLLocationManager的requestLocation方法。定位完成后,会自动让定位硬件断电;
- 尽量降低定位精度,比如尽量不要使用精度最高的KCLLocationAccuracyBest。精度越高,硬件模块功耗越大;
- 需要后台定位时,尽量设置pauseLocationUpdatesAutomatically为YES,如果用户不太可能移动的时候系统会自动暂停位置更新;
- 尽量不要使用startMonitoringSignificantLocationChanges,优先考虑startMonitoringForRegion;
3、CPU优化
- Timer的时间间隔不宜太短,满足需求即可;
- 线程适量,不宜过多,不要阻塞主线程;
- 优化算法,减少循环次数;
- 图片处理:
图片与imageView相同大小,避免多余运算
可以使用整副的图片,增加应用体积,但是节省CPU
- 复杂计算结果的缓存(UITableView的行高)
- 懒加载,不要一次性创建所有的subview,而是需要时才创建;
- 对象重用,避免重复创建;
- 避免庞大的xib,storyBoard,尽量使用纯代码开发;
- 减少复杂视图中autolayout的使用
- 不要频繁的刷新页面,能刷新1行cell最好只刷新一行,尽量不要使用reloadData;
- 选择正确的集合:
NSArray,使用index来查找很快(插入和删除很慢)
NSDictionary字典,使用键来查找很快
NSSets,是无序的,用键查找很快,插入/删除很快
- 合理使用NSDateFormatter 和 NSCalendar这种高开销对象。性能测试表明,NSDateFormatter的性能瓶颈是由于NSDate格式到NSString格式的转化,所以把NSDateFormatter创建单例意义不大。推荐的做法是,把最常用到的日期格式做缓存。
static NSDateFormatter *cachedDateFormatter = nil;
+ (NSDateFormatter *)cachedDateFormatter {
if (!dateFormatter) {
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat: @“YYYY-MM-dd HH:mm:ss”];
}
return dateFormatter;
}
4、GPU优化
- 乱使用GPU会导致交互变差,并且降低电池寿命;
- 少用运算获得圆角,不论view.maskToBounds还是layer.clipToBounds都会有很大的资源开销,必须要用圆角的话,不如把图片本身就做成圆角;
- 尽量少用透明或半透明,会产生额外的运算;
5、后台优化
- 后台状态App仍会消耗电量,App要按需执行后台操作,并使用延迟APIs来保证系统运算高效执行。
- 在app进入后台状态时,立即减少动作,并且通知系统一次这些动作已经完成;
6、I/O操作
- 尽量不要频繁写入小数据,一次性写入数据量大的,用数据库(如Sqlite、Realm)或者用Dispatch_io来读取大量重要数据。
- 需要图片读写的,可以采用类似SDWebImage框架设计的方式:在图片读取缓存的时候,优先使用系统自带的NSCache,查找不到再通过I/O读取磁盘缓存图片,减少了电量消耗;
7、硬件检测优化
- 用户移动、摇晃、倾斜设备时,会产生动作(motion)事件,这些事件由加速度计、陀螺仪、磁力计等硬件检测。在不需要检测的场合,应该及时关闭这些硬件。