UITableViewCell的重用
一、Cell的
重用原理:
当滚动列表时,部分
UITableViewCell
会移出窗口,
UITableView
会将窗口外的
UITableViewCell
放入一个对象池中,等待重用。当
UITableView
要求
dataSource
返回
UITableViewCell
时,
dataSource
会先查看这个对象池,如果池中有未使用的
UITableViewCell
,
dataSource
会用新的数据配置这个
UITableViewCell
,然后返回给
UITableView
,重新显示到窗口中,从而避免创建新对象。
还有一个非常重要的问题:有时候需要自定义
UITableViewCell(
用一个子类继承
UITableViewCell)
,而且每一行用的不一定是同一种
UITableViewCell
,所以一个
UITableView
可能拥有不同类型的
UITableViewCell
,对象池中也会有很多不同类型的
UITableViewCell
,那么
UITableView
在重用
UITableViewCell
时可能会得到错误类型的
UITableViewCell。
解决方案: UITableViewCell 有个 NSString *reuseIdentifier 属性,可以在初始化 UITableViewCell 的时候传入一个特定的字符串标识来设置 reuseIdentifier( 一般用 UITableViewCell 的类名 ) 。当 UITableView 要求 dataSource 返回 UITableViewCell 时,先通过一个字符串标识到对象池中查找对应类型的 UITableViewCell 对象,如果有,就重用,如果没有,就传入这个字符串标识来初始化一个 UITableViewCell 对象。
解决方案: UITableViewCell 有个 NSString *reuseIdentifier 属性,可以在初始化 UITableViewCell 的时候传入一个特定的字符串标识来设置 reuseIdentifier( 一般用 UITableViewCell 的类名 ) 。当 UITableView 要求 dataSource 返回 UITableViewCell 时,先通过一个字符串标识到对象池中查找对应类型的 UITableViewCell 对象,如果有,就重用,如果没有,就传入这个字符串标识来初始化一个 UITableViewCell 对象。
二、Cell
的性能优化
UITableView 默认只会加载出现在屏幕上面的 cell ,没当有一个 cell 移除屏幕,就会存储到缓存池里找。
性能优化步骤:
步骤一:定义 cell 的标识(不需要每次都创建 cell 标识,因此需要使用 static , static 标识只会在第一次创建,以后都不会创建了。)
步骤二:从缓存池里取 cell
步骤三:判断取出 cell 是否为空,如果为空就手动创建 cell 。
UITableView 默认只会加载出现在屏幕上面的 cell ,没当有一个 cell 移除屏幕,就会存储到缓存池里找。
性能优化步骤:
步骤一:定义 cell 的标识(不需要每次都创建 cell 标识,因此需要使用 static , static 标识只会在第一次创建,以后都不会创建了。)
步骤二:从缓存池里取 cell
步骤三:判断取出 cell 是否为空,如果为空就手动创建 cell 。
三
、如何提高
tableView
的性能
a 、重用 cell
我们都知道申请内存是需要时间,特别是在一段时间内频繁的申请内存将会造成很大的开销,而且上 tebleView 中 cell 大部分情况下布局都是一样的,这个时候我们可以通过回收重用机制来提高性能。
a 、重用 cell
我们都知道申请内存是需要时间,特别是在一段时间内频繁的申请内存将会造成很大的开销,而且上 tebleView 中 cell 大部分情况下布局都是一样的,这个时候我们可以通过回收重用机制来提高性能。
b 、避免 content 的重新布局
尽量避免在重用 cell 时候,对 cell 的重新布局,一般情况在在创建 cell 的时候就将 cell 布局好。
c 、使用不透明的 subView
在定制 cell 的时候,将要添加的 subView 设置成不透明的会大大减少多个 view 层叠加时渲染所需要的时间。
d 、如果方便,直接重载 subView 的 drawRect 方法
如果定制 cell 的过程中需要多个小的元素的话,最好直接对要显示的多个项目进行绘制,而不是采用添加多个 subView 。
e 、 tableView 的 delegate 的方法如非必要,尽量不要实现
tableView 的 delegate 中的很多函数提供了对 cell 属性的进一步控制,比如每个 cell 的高度, cell 是否可以编辑,支持的 edit 风格等,如非必要最好不要实现这些方法因为快速的调用这些方法也会影响性能。