iOS开发——性能优化

来源:互联网 发布:有深度的书籍推荐知乎 编辑:程序博客网 时间:2024/06/08 00:09


个人认为性能优化主要从两个方面进行。第一是内存优化,第二是屏幕流畅度(卡顿)优化

很多时候,这两个方面的优化,是相辅相成的,又互相有影响。

检测的工具主要用xcode的instruments工具集的部分工具检测和一些第三方控件或库。

卡顿一般是CPU的计算和GPU的渲染之间没能及时交换数据,掉帧。或者GPU出现了离屏渲染,GPU和CPU工作不均衡导致。


一,内存优化:  


1,内存管理尽量用ARC,C语言的注意手动释放。

2,注意一些delegate,block,nstimer等会造成循环引用的问题,通知在的dealoc方法内释放。

3,经常用的图片要缓存的图片加载可以用imageNamed,

     不常用的图片或不用缓存的或者图片较大,用initwithContentFile加载图片。

4,cell的复用,包括head,foot,colletionCell等。

5,如果tableview 的cell都是固定高度的,直接给tableview的行高属性赋值高度,不用再代理方法获取高度。

6,创建了大量的临时对象可以用aotureleaspool及时释放。

7,自定义NSLog宏,调试时用自定义的输出,打包的时候去掉输出,比如

#ifdef DEBUG          //如果是调试状态#define HITLog(...)   NSLog(__VA_ARGS__)       //把NSLog换成自己写的HITLog#else                 //如果是发布状态#define HITLog(...)   //把自己写的HITLog定义成空#endif

8,如果不能纯代码的工程,尽量少用XIB,它站内存很大。优选选择stroryboard.

9,对象懒加载,部分view延时加载(若可以,不要全部在veiwdidload里加载完)

10,用GUPImage处理拍照。

11,在加载图片前,处理好不合格的图片缩放或压缩等。

12,若在didReceiveMemoryWarning方法内有内存警告,去掉当前展示的控制器内的view,当控制器再次从后台显示时再重新初始话加载视图。

13,若条件允许单利,且不常用的,少用单例和静态变量这些常驻内存的。

14,网络数据格式尽量用JSon格式,数据量小。

15,需要web控件时,若项目适配iOS8及以后,就用新的WKWeb控件,内存占用小,不用旧的webview控件。

16,至于gzip压缩,根据项目情况选择,很多的第三方都默认支持。

目前在内存优化的想到这些,以后继续更新……


二,屏幕流畅度(卡顿)优化:

1,都知道主线是做UI刷新的,所以非UI的事情或者计算用子线程去做。完成后回调主线程刷新

2,懒加载view,及时销毁不用的view。view少用透明度,劲量不透明。因为GPU渲染的时候会根据各个视图透明度组合计算最终显示的样式。

3,缓存的运用,比如常用图片,行高,cell属性和内容等可以快速调用。

4,整个项目的适配可以尽量用纯代码的frame值,用宽高比例值去适配。

5,类似tableview这些带复用机制的cell,要注意离屏渲染。

     cell的图片尽量少用圆角,阴影等。要是用圆角加上layer.shouldRasterize = YES,类似缓存,或者参考网上更好的方法

    减少cell的数量、种类、复杂度

    cell的内容展示的时候,在tableview的代理方法cellwilldisplay中调用cell内容展示,这样流畅。

6,不需要触摸事件,通知等时候,劲量不用view,用轻量级的layer图层。CALayer比CoreGraphic性能好

7,异步子线程创建UI对象及其需要的数值计算结果。AsyncDisplayKit,是Facebook出的非常不错的异步子线程UI创建,用它项目非常流畅。

8,注意死锁的数据造成卡顿

9,动画的适当使用。

10,单个控制器有多任务接口请求数据时可以用信号量等待机制,更好的展示UI及刷新数据。

目前想到这些,今后会继续更新……

原创粉丝点击