dequeueReusableCellWithIdentifier的运行机制

来源:互联网 发布:stm8l152数据手册 编辑:程序博客网 时间:2024/04/20 05:42

[html] view plaincopy
  1. <span style="color:#ffffff;">   </span> UITableViewCell *cell = nil;  
  2.       
  3.     if([indexPath row] == 0)  
  4.     {  
  5.         static NSString *kDisplayCell_ID = @"DisplayCellID";  
  6.         //队列?为什么?n 叫集合  //类型。  
  7.         cell = [self.tableView dequeueReusableCellWithIdentifier:kDisplayCell_ID];  
  8.         if(cell == nil)  
  9.         {  
  10.             //设置队列?内容?  
  11.             cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kDisplayCell_ID]autorelease];  
  12.             cell.selectionStyle = UITableViewCellSelectionStyleNone;  
  13.         }  
  14.         else  
  15.         {  
  16.             //为什么?  
  17.             UIView *viewToRemove = nil;  
  18.             viewToRemove = [cell.contentView viewWithTag:kViewKey];  
  19.             if(viewToRemove)  
  20.                 [viewToRemove removeFromSuperview];  
  21.         }  
  22.         cell.textLabel.text = [[self.dataSourceArray objectAtIndex:indexPath.section] valueForKey:kLabelKey ];  
  23.         UIButton *button = [[self.dataSourceArray objectAtIndex:indexPath.section] valueForKey:kViewKey];  
  24.         [cell.contentView addSubview:button];  
  25.     }  


dequeueReusableCellWithIdentifier消息返回的是UITableViewCell对象,即是说这是一个用来获取UITableViewCell对象的消息,废话。
之所以不说是初始化一个对象,是因为它可能返回nil值,所以才要在下面补充一个如果cell为nil时的处理过程。
那么这个方法是不是可以解释成为,从一个UITableViewCell对象池中获取一个以Identifier参数命名的UITableViewCell对象。
如果在资源紧缺的时候,这个池会自动清理多余的UITableViewCell对象,则可能无法返回对象,但如果资源丰富,则会保存一些UITableViewCell对象,在需要调用的时候迅速的返回,而不用创建。


dequeueReusableCellWithIdentifier,从字面上理解是“出列的可重用的cell”,其实简单说就是一个cell池,里面放的就是你之前创建过的cell。使用时要注意:
1。重取出来的cell是有可能已经捆绑过数据或者加过子视图的,所以,如果有必要,要清除数据(比如textlabel的text)和remove掉add过的子视图(使用tag)。
2。这样设计的目的是为了避免频繁的 alloc和delloc cell对象而已,没有多复杂。
3。设计的关键是实现cell和数据的完全分离


关键点在"一个屏幕显示的cell数量"是有限的
当屏幕滚动时候,就会调用方法获取新的cell,而老的cell会在屏幕外面就不显示了

reuse机制就是这样。。当cell需要显示的时候,从queue里面找,找到了,设置一下内容,显示出来
滚动界面当有cell被移出屏幕时,把这个cell丢到queue里面
显示新的cell时,如果有“相同类型”(identifier)的cell,就从队列拿一个出来,设置数据,显示出来
至于queue里面会有多少cell,这个会自动控制

要注意的是,queue里面存储的是cell的实例,不是“原型”
因此就会出现上面说的“假设每页有 5个。 则 第6个复用第1个cell; 第7个复用第2个;”
这样的结果是不管你的table有多少行,内存里实际上都只需要存储一个屏幕那么多行的cell就搞定了。。


[html] view plaincopy
  1. <span style="color:#ffffff;font-family: Verdana; font-size: 13px; ">    </span><span style="background-color: rgb(255, 255, 255); ">        // the cell is being recycled, remove old embedded controls  
  2.             //为什么 这么使劲?  
  3.             UIView *viewToRemove = nil;  
  4.             viewToRemove = [cell.contentView viewWithTag:kViewTag];  
  5.             if (viewToRemove)  
  6.                 [viewToRemove removeFromSuperview];</span>  

/** 此时,该CELL被复用,则清除这个CELL上之前添加的控件 */

原创粉丝点击