UITableView的调优技巧
- 正确使用reuseIdentifier来重用Cells,这样可以保证cell不会一直被创建。
常用写法:
MyCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"];
if (cell==nil) {
cell = [[MyCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:@"cell"];
}
return cell;
- 尽量使所有的view opaque,包括Cell自身。
系统中的view.opaque默认是YES,绘图系统会将view看成为完全不透明,这样绘制系统就可以优化一些绘
制操作以提升性能。如果设置的为NO,那么绘制系统需要结合其他内容来处理view。
Apple官方文档堆opaque属性的解释如下:
This property provides a hint to
he drawing system as to how it should treat the view. If set to YES,
the drawing system treats the view as fully opaque, which allows the
rawing system to optimize some drawing operations and improve
performance. If set to NO, the drawing system composites the view
normally with other content. The default value of this property is YES.
-
如果Cell内显示的内容来自Web,则需要使用异步加载,缓存请求结果
使用异步加载不去卡UI线程,如果可以的话将服务器也支持缓存,这样再次请求的的时候会很快,或是使用开源的缓存库。
-
减少subviews的数量
很容易理解,subviews数量越多,在绘制的时候开销越大就会越影响性能。
-
尽量少用addView给Cell动态添加View,可以初始化时就添加,然后通过hide来控制显示。
-
提前计算并缓存好高度,因为heightForRowAtIndexPath:是调用最频繁的方法
如果是固定高度的最好,如果cell高度不同可以通过sourceData提前计算出每个cell的高度缓存起来,不要在heightForRowAtIndexPath函数里面做计算操作。
-
异步绘制,遇到复杂的界面,遇到性能瓶颈时,可能就是突破口
在Cell上添加系统控件的时候,实质上系统都需要调用底层的接口进行绘制,当我们大量添加控件的时候,对资源开销也会很大,可以通过异步直接绘制,提高效率
-
滑动时按需加载,这个在大量图片展示,网络加载的时候很管用
因为UITableView是继承自UIScrollView的,所以我们可以监听UIScrollView的滑动事件,在UIScrollView将要滑动结束的时候,去计算哪些cell数据该显示出来,这样就减少了中间快速滑动时的cell加载了。