iOS学习笔记(4)— UITableView的重用机制

  UITableView中的cell是动态的,在使用过程中,系统会根据屏幕的高度(480)和每个cell的高度计算屏幕中需要显示的cell的个数。比如,cell高度为90。那么480 / 90 = 5 + 1,也就是说最多有6cell能显示在屏幕中。

  系统会创建1cel池,无论tableview有多少行都只创建6cell放在池中。当某行移出屏幕的时候,将这个cell放回在池中;当某行需要显示在屏幕中时,从池中取出一个cell

 

  重用机制需要制定一个cellIdentifier(行标识)来区分所需要的不同种类的cell,如果是同一类型的cell只需要制定一个identifier

  可以对cell进行操作,改变属性如文字、背景图片,但是不能改变其本身,不能把它转化成另一个类型的对象。如果有这个需要应该制定两个或多个cellIdentifier

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString * aCellIdentifier = @"CELLIDENTIFIERl";
    CustomCell*ell=(CustomCell*)[tableView] dequeueReusableCellWithIdentifier:aCellIdentifier];

    if (cell == nil) 
    {
            cell = [[[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: aCellIdentifier] autorelease];   
  }
  cell.title = [NSString stringWithFormat:@”标题 %d”,indexPath.row];
  return cell;
}

  代码分析:

  CustomCell继承自UITableCell

  CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];它的文档说明如下:returns a reusable table-view cell object located by its identifier。它返回的是一个受identifier管理定位的可重用的tableViewCell,这里重点就在于“可重用”这3个字上。

  在这个例子中,if(cell == nil){}中的语句只执行了6次,前6次池里面没有cell取出的cell都是nil6次之后从池里可以取出cell,条件不成立直接执行之后的语句。

  重用机制的好处是显而易见的,无论tableview有多少行都只创建屏幕能显示的行数。节省了内容。由于有缓存池实现了cell的重用,避免了反复的allocrelease

  UITableView开发时可利用的优化点。

  1、所有cell通用的属性放在自定义cell里这样可以节省系统开销,如背景图片。

  2、如果cell只有少数几个种类,则用不同的cellIdentifier标识,避免反复操作cellsubview用内存换cpu

  3、cell的种类不能太多,过多的cellIndentifier相当于废掉了UITableView的重用机制。

原文地址:https://www.cnblogs.com/zy1987/p/3195739.html