苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 4186|回复: 6

[基础] iOS中UITableViewCell的重用机制和原理

[复制链接]
发表于 2018-12-4 18:38:33 | 显示全部楼层 |阅读模式


在我们实现UITableView的相关数据代理方法之后,会有下面的这些代码

[Objective-C] 纯文本查看 复制代码
- (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;
}


这里就用到了TableView的重用机制,为了做到显示和数据的分离,iOS TableView的实现并不是为每个数据项创建一个tableviewCell。而是只创建屏幕可显示最大个数的cell,然后重复使用这些cell,对 cell做单独的显示配置,来达到既不影响显示效果,又能充分节约内容的目的。下面简要分析一下它的实现原理。


查看UITableView头文件,会找到NSMutableArray*  visiableCells,和NSMutableDictnary* reusableTableCells两个结构。visiableCells内保存当前显示的cellsreusableTableCells保存可重 用的cells。
  TableView显示之初,reusableTableCells为空,那么tableView dequeueReusableCellWithIdentifier:CellIdentifier返回nil。开始的cell都是通过 [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]来创建,而且cellForRowAtIndexPath只是调用最大显示cell数的次数。
  比如:有100条数据,iPhone一屏最多显示10个cell。程序最开始显示TableView的情况是:
  1. 用[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]创建10次cell,并给cell指定同样的重用标识(当然,可以为不同显示类型的 cell指定不同的标识)。并且10个cell全部都加入到visiableCells数组,reusableTableCells为空。
  2. 向下拖动tableView,当cell1完全移出屏幕,并且cell11(它也是alloc出来的,原因同上)完全显示出来的时候。cell11加入到 visiableCellscell1移出visiableCellscell1加入到reusableTableCells
  3. 接着向下拖动tableView,因为reusableTableCells中已经有值,所以,当需要显示新的 cellcellForRowAtIndexPath再次被调用的时候,tableView dequeueReusableCellWithIdentifier:CellIdentifier,返回cell1cell1加入到 visiableCellscell1移出reusableTableCellscell2移出visiableCellscell2加入到 reusableTableCells。之后再需要显示的Cell就可以正常重用了。
  所以整个过程并不难理解,但需要注意正是因为这样的原因:配置Cell的时候一定要注意,对取出的重用的cell做重新赋值,不要遗留老数据。



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2018-12-4 18:39:54 | 显示全部楼层
使用过程中,我注意到,并不是只有拖动超出屏幕的时候才会更新reusableTableCells表,还有:

  1. reloadData,这种情况比较特殊。一般是部分数据发生变化,需要重新刷新cell显示的内容时调用。在 cellForRowAtIndexPath调用中,所有cell都是重用的。我估计reloadData调用后,把visiableCells中所有 cell移入reusableTableCells,visiableCells清空。cellForRowAtIndexPath调用后,再把 reuse的cell从reusableTableCells取出来,放入到visiableCells。

  2. reloadRowsAtIndex,刷新指定的IndexPath。如果调用时reusableTableCells为空,那么 cellForRowAtIndexPath调用后,是新创建cell,新的cell加入到visiableCells。老的cell移出 visiableCells,加入到reusableTableCells。于是,之后的刷新就有cell做reuse了。
发表于 2018-12-4 18:44:38 | 显示全部楼层
强烈支持楼主ing……
发表于 2018-12-4 18:50:00 | 显示全部楼层
真是难得给力的帖子啊。
发表于 2018-12-4 19:53:29 | 显示全部楼层
真是难得给力的帖子啊。
发表于 2018-12-4 19:54:06 | 显示全部楼层
无回帖,不论坛,这才是人道。
发表于 2018-12-4 21:13:30 | 显示全部楼层
激动人心,无法言表!
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-27 14:37

© 2014-2021

快速回复 返回顶部 返回列表