工作一年多的时间,本以为对Cell的复用已经理解透彻了,然而通过这次版本的迭代开发,发现自己远没有达到透彻的标准。于是抽出时间做一下小结:
按照平时的方式,我们创建使用一个UITableViewCell常见的方式是:
UITableViewCell *cell = [[UITableViewCell alloc] init];
cell.textLabel.text = @"hello";...
但是这种方式有个弊端,当创建大量的cell的时候容易浪费内存。比如也许刚开始我们我们要创建300个cell的时候还好,因为只有当这个cell真正显示在屏幕上的时候才会被创建(苹果帮我们做了优化,只有当cell即将被显示到屏幕上才会调用tableView:cellForRowAtIndexPath:
)。但是当我们在屏幕上滑动tableView的时候依然存在问题,因为在我们滑动的过程中会存在cell的频繁创建与销毁。
幸好苹果提供了更加简洁的方式来创建cell,如下所示:
方式一:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString * const cellIdentifier = @"CellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
cell.backgroundColor = [UIColor greenColor];
}
cell.textLabel.text = @"hello";
return cell;
}
tableView首先会去缓存池中取绑定cellIdentifier标识的cell,如果取到则返回;如果取不到,则会创建一个新的cell并绑定标识。在使用的过程中一定要注意cell属性设置的时机,一般在if条件括号内的,是cell的固有属性,当这个cell被取出重新复用的时候,会带有这个属性。而if条件判断之外,则会随着每列cell的重新加载(无论是复用还是创建),会重新赋值。
- 方式二:注册cell,然后直接从缓存获取
这种方式一般会用在自定义cell的加载中,也就是我们既可以通过一个类也可以通过一个nib文件来加载cell。当注册一个cell并绑定标识后,tableView会先从缓存池中取绑定的标识的cell,若是没有系统则会自动创建一个cell,并绑定标识。NSString * const cellIdentifier = @"CellIdentifier"; - (void)viewDidLoad { [super viewDidLoad]; [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellIdentifier]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; cell.textLabel.text = @"hello"; return cell; }