个人认为性能优化主要从两个方面进行。第一是内存优化,第二是屏幕流畅度(卡顿)优化。
很多时候,这两个方面的优化,是相辅相成的,又互相有影响。
检测的工具主要用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,要注意离屏渲染。
layer.shouldRasterize = YES,类似缓存,或者参考网上更好的方法
减少cell的数量、种类、复杂度
cell的内容展示的时候,在tableview的代理方法cellwilldisplay中调用cell内容展示,这样流畅。
6,不需要触摸事件,通知等时候,劲量不用view,用轻量级的layer图层。CALayer比CoreGraphic性能好
7,异步子线程创建UI对象及其需要的数值计算结果。AsyncDisplayKit,是Facebook出的非常不错的异步子线程UI创建,用它项目非常流畅。
8,注意死锁的数据造成卡顿
9,动画的适当使用。
10,单个控制器有多任务接口请求数据时可以用信号量等待机制,更好的展示UI及刷新数据。
目前想到这些,今后会继续更新……