美文网首页
Cell的复用

Cell的复用

作者: 木子尚武 | 来源:发表于2016-11-13 23:17 被阅读52次

    工作一年多的时间,本以为对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,并绑定标识。

    相关文章

      网友评论

          本文标题:Cell的复用

          本文链接:https://www.haomeiwen.com/subject/ltlcpttx.html