UITableView中的cell的优化
1.cell的重用
所谓的cell的重用就是,视图加载的时候只会创建当前视图中的cell,或者比当前视图多一点的cell, 当视图滚动的时候,滚出屏幕的cell会放进缓存中,滚进屏幕的cell会根据Identifier从缓存中获取cell,如此的循环往复,这样只会创建固定的cell对象,节省了内存。
下面是重用cell的代码:
//1. 定义重用的标识
static NSString *reuseId = @"tg";
//2,从缓存中获取重用cell
CZTgCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseId];
//3.判断如果cell等于nil 就创建cell
if (cell == nil) {
cell = [[[NSBundle mainBundle]loadNibNamed:@"CZTgCell" owner:nil options:nil]lastObject];
}
return cell;
2.为什么定义重用标识符的时候,定义为静态的
cell调用的次数相当多,会创建多次标识符对象,而静态的变量只会创建一次开辟一块内存,节省了内存空间。
3.cell的init方法的注意点
重写init方法,添加子控件时,在这个方法中,需要对控件的一次性属性进行设置,所谓的一次性属性,指的是像文字的大小啊文字的颜色啊之类的固定值,因为这些属性和数据没有关系,提高了性能。
注意:设置控件的frame,直接在init方法中headView的frame没有效果,所以要在layoutSubviews方法中设置各个子控件的frame,这个方法必须重写父类的方法。
4.cell重用的时候,不光要覆盖数据,也应该要覆盖对应的状态,否则重用的时候会把状态和数据都会重用
重用解决:在重写模型的set方法,覆盖数据和状态。
5.cell的行高的问题
cell创建之前多次计算行高,如果行高是固定的,那尽量少用下面的代理方法,因为它会多次调用并计算行高,可以用tableView的rowHeight属性
-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath;