1. 基础优化
1. 减少使用xib及storyboard(加载速度慢;导致APP启动时间比较耗时,因为在APP启动main()以前需要加载他们)
2. 懒加载
可以节省内存资源,用到时才去加载所使用对象
3. 单例模式
在项目开发过程中会用到很多重大开销对象(比如NSDateFormatter和 NSCalendar),如我们在列表需要计算用户年龄的时候会经常用到NSDateFormatter,还有一些时间的格式化输出,或者在网络请求的时候需要传一些时间戳,所以我们可以把NSDateFormatter放在单利里面,这样就不用经常创建了
4. 离屏渲染
在开发中,我们常用有圆角处理、阴影、遮罩等等;先说说圆角优化吧,我们一般设置圆角的方式如下:
view.layer.cornerRadius = 10;
view.layer.maskToBounds = YES;
这样处理的渲染机制是GPU在当前屏幕缓冲区外新开辟一个渲染缓冲区进行工作,也就是离屏渲染,这会给我们带来额外的性能损耗,如果这样的圆角操作达到一定数量,会触发缓冲区的频繁合并和上下文的的频繁切换,性能的代价会宏观地表现在用户体验上——掉帧。
优化方案:
a.可以做一个透明的png图片盖在上面;
b.使用贝塞尔曲线UIBezierPath和Core Graphics框架画出一个圆角;
c.使用CAShapeLayer和UIBezierPath设置圆角;
d.也可以将图片的处理放在服务端(比如:七牛云储存就可以设置图片的圆角);
e.尽量把view设置成不透明的。
5. 列表TableView优化
5.1提前计算好cell的高度,缓存在相应的数据源模型中
tableView的代理回调方法中,先调用的是返回cell高度的方法,然后在返回实例化cell的方法.我们可以在返回cell高度时,提前计算好cell的高度,在获取数据后台数据的时候,把cell高度计算出来,缓存到数据源模型中. 在返回cell高度的方法中,直接读取缓存的高度,而不需要在重新计算了.
5.2 尽可能的降低storyboard,xib等使用度
通过Interface知道xib或者storyboard本身就是一个xml文件,添加删除控件必然中间多了一个encode/decode过程,增加了cpu的计算量.并且 还要避免臃肿的 XIB 文件,因为XIB文件在主线程中进行加载布局.当用到一些自定义View或者XIB文件时,XIB的加载会把所有内容加载进来,如果XIB里面的一些控件并不会用到,这就可能造成一些资源的消耗浪费。
5.3 滑动过程中尽量减少重新布局
5.4.少用或不用透明图层
使用不透明视图。对于不透明的View,设置opaque为YES,这样在绘制该View时,就不需要考虑被View覆盖的其他内容(尽量设置Cell的view为opaque,避免GPU对Cell下面的内容也进行绘制)
5.5 滑动时按需加载对应的内容
如果目标行与当前行相差超过指定行数,只在目标滚动范围的前后指定3行加载。滑动很快时,只加载目标范围内的cell,这样按需加载(配合SDWebImage),极大提高流畅度。
参考资料:
网友评论