Cell的复用

工作一年多的时间,本以为对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,然后直接从缓存获取
       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;
       }
    
    这种方式一般会用在自定义cell的加载中,也就是我们既可以通过一个类也可以通过一个nib文件来加载cell。当注册一个cell并绑定标识后,tableView会先从缓存池中取绑定的标识的cell,若是没有系统则会自动创建一个cell,并绑定标识。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容