iOS梦工厂

iCocos——不战胜自己,何以改变未来!

UITableView性能优化与卡顿问题

| Comments

引言:

在iOS开发中关于TableView算是已经用烂了的控件,但是又有几个人认真去考路过他的性能优化问题(卡顿)

最近项目中也遇到了不少卡顿的问题,为了更好的饿提高项目的性能,也为了提高自己的技术,专门花了一段时间研究了一下关于TableView的性能问题,在这里就总结了一下,希望可以帮你解决实际问题。

1.最常用的就是cell的重用, 注册重用标识符

如果不重用cell时,每当一个cell显示到屏幕上时,就会重新创建一个新的cell
如果有很多数据的时候,就会堆积很多cell。如果重用cell,为cell创建一个ID
每当需要显示cell 的时候,都会先去缓冲池中寻找可循环利用的cell,如果没有再重新创建cell
设置正确的reuseIdentifer以重用cell

2.避免cell的重新布局

cell的布局填充等操作 比较耗时,一般创建时就布局好
如可以将cell单独放到一个自定义类,初始化时就布局好

3.提前计算并缓存cell的属性及内容

在cellForRowAtIndexPath:中尽量做更少的操作。如果需要做一些处理,那么最好做过一次之后,就将结果缓存起来。
当我们创建cell的数据源方法时,编译器并不是先创建cell 再定cell的高度
而是先根据内容一次确定每一个cell的高度,高度确定后,再创建要显示的cell,滚动时,每当cell进入凭虚都会计算高度,提前估算高度告诉编译器,编译器知道高度后,紧接着就会创建cell,这时再调用高度的具体计算方法,这样可以方式浪费时间去计算显示以外的cell

4.减少cell中控件的数量

尽量使cell得布局大致相同,不同风格的cell可以使用不用的重用标识符,初始化时添加控件,
不适用的可以先隐藏

5.不要使用ClearColor,无背景色,透明度也不要设置为0

渲染耗时比较长
尽量将view设置为不透明,包括cell本身。

6.使用局部更新

如果只是更新某组的话,使用reloadSection进行局部更新

7.加载网络数据,下载图片,使用异步加载,并缓存

如果cell显示的内容来此网络,那么确保这些内容是通过异步来获取的

8.少使用addView 给cell动态添加view

9.按需加载cell,cell滚动很快时,只加载范围内的cell

注意正确使用懒加载

10.不要实现无用的代理方法,tableView只遵守两个协议

非必要的代理或者数据源方法可以省略,比如numberofsention

11.缓存行高:

如果row的高度不相同,那么将其缓存下来
estimatedHeightForRow不能和HeightForRow里面的layoutIfNeed同时存在,这两者同时存在才会出现“窜动”的bug。所以我的建议是:只要是固定行高就写预估行高来减少行高调用次数提升性能。如果是动态行高就不要写预估方法了,用一个行高的缓存字典来减少代码的调用次数即可

12.避免渐变,图像缩放以及离屏绘制

13.使用shadowPath来设置阴影。

14.使用适当的数据结构来保存需要的信息。不同的结构会带来不同的操作代价。

15.使用rowHeight, sectionFooterHeight 和 sectionHeaderHeight 来设置一个恒定 高度,而不要从delegate中获取。

16.使用富文本标签代价是很昂贵的

费尽周折用富文本标签,代价太昂贵了。尽可能地避免使用这个。问问你自己是否真的需要这个。如果是的话,尽可能的做缓存。


参考:相关性能优化问题

iOS应用性能调优的25个建议和技巧



微信号:

clpaial10201119(Q Q:2211523682)

微博WB:

http://weibo.com/u/3288975567?is_hot=1

gitHub:

https://github.com/al1020119

博客

http://al1020119.github.io/


Comments