iOS UITableViewCell重用以及自定义Cell

今天来讲一下UITableViewCell的重用问题,记得有一次去面试,被问到UITableViewCell是怎么优化的?然后是怎么重用的?Cell重用缓存在哪里?当时怎么回答的不记得了,反正能答得都答了,不能答得在乱扯,结果一下就露馅了。好吧不扯了,进入正题。

UITableViewCell的重用是对列表的一种优化机制,试想一下,如果你有成千上万条数据需要显示,如果每条数据需要alloc一个cell,那要消耗多少的内存空间,所以就有了cell的重用机制,那么问题来了,cell是怎么重用的呢?

cell是通过一个缓存池来重用,每个cell都会注册一个identifier放入缓存池,当需要调用的时候就直接从缓存池里找对应的id,当不需要时就放入缓存池等待调用。

看代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
  static NSString *CellIdentifier = [NSString stringWithFormat:@"Cell"];  
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];  
  if (cell == nil) {  
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];  
  }  
  //config the cell  
  return cell;  
} 
这段代码第一步,创建一个id字符串;第二步,从缓存池中取出相应的id的cell进行重用;第三步,如果没有这个cell就alloc这个cell,并注册它的id标识。

当一个屏幕可以容纳10个cell时,cell会被alloc10次,假设从cell1到cell10,然后当cell1移出屏幕,加入缓存池(并不会被release),第二步代码会起作用,从缓存池中找到对应的id的cell加载出来。

ok,我们现在已经知道cell是怎么重用的了,那么第二个问题:cell的缓存池在哪里?

当cell要alloc时,UITableView会在堆中开辟一段内存以供cell缓存之用,从结构上分析:NSMutableArray*  visiableCells,和NSMutableDictionary* reusableTableCells两个结构。visiableCells内保存当前显示的cells,reusableTableCells保存可重用的cells。

那么我们接下来看自定义的cell怎么重用:

//首先自定义一个HY_Cell的类
static NSString *reuseIdentity = @"Cell";
    if (!isReuseIdentityRegisted) {
        UINib *nib = [UINib nibWithNibName:@"HY_Cell" bundle:nil]; //从nib中加载这个HY_Cell类
        [tableView registerNib:nib forCellReuseIdentifier:reuseIdentity]; //注册这个自定义的cell的重用标识,并加入缓存池
        isReuseIdentityRegisted = YES;
    }
    
    HY_Cell *resuCell = (HY_Cell*)[tableView dequeueReusableCellWithIdentifier:reuseIdentity];  // 从缓存池中取出自定义cell
    return resuCell;



好了,到这里基本cell的重用都讲完了。


你可能感兴趣的:(UITableViewCell)