创建UITableViewController子类的实例后,IDE生成的代码中有如下段落:

- (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的实现并且不是为每个数据项创建一个tableCell。而是只创建屏幕可显示最大个数的cell,然后重复使用这些cell,对 cell做单独的显示配置,来达到既不影响显示效果,又能充分节约内容的目的。下面简要分析一下它的实现原理。

重用实现分析

  查看UITableView头文件,会找到NSMutableArray*  visiableCells,和NSMutableDictnery* reusableTableCells两个结构。visiableCells内保存当前显示的cells,reusableTableCells保存可重 用的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加入到 visiableCells,cell1移出visiableCells,cell1加入到reusableTableCells。

  3. 接着向下拖动tableView,因为reusableTableCells中已经有值,所以,当需要显示新的 cell,cellForRowAtIndexPath再次被调用的时候,tableView dequeueReusableCellWithIdentifier:CellIdentifier,返回cell1。cell1加入到 visiableCells,cell1移出reusableTableCells;cell2移出visiableCells,cell2加入到 reusableTableCells。之后再需要显示的Cell就可以正常重用了。

  所以整个过程并不难理解,但需要注意正是因为这样的原因:配置Cell的时候一定要注意,对取出的重用的cell做重新赋值,不要遗留老数据。

一些情况

  使用过程中,我注意到,并不是只有拖动超出屏幕的时候才会更新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了。

转载于:https://www.cnblogs.com/mawenqiangios/p/4996175.html

IOS中UITableViewCell的重用机制原理相关推荐

  1. iOS中UITableViewCell的重用问题解决方案

    UITableViewCell重用 为了能够保证tableViewCell能够高效的执行,Objective-c中引进了重用队列的机制,重影现象也是在重用队列时经常遇到的问题,那么如何解决这个问题呢? ...

  2. iOS开发-自己定义重用机制给ScrollerView加入子视图

    iOS开发-自己定义重用机制给ScrollerView加入子视图 事实上这个问题我非常早就想过,仅仅是没有通过去写程序实现,昨天有人提起,我就巧了一下 不知道大家打印郭tableview:cellfo ...

  3. 解决UICollectionViewCell/UITableViewCell因重用机制导致的错乱问题

    解决UICollectionViewCell/UITableViewCell因重用机制导致的错乱问题 UICollectionView和UITableView在开中用的很多,可以解决很多复杂的布局问题 ...

  4. iOS开发之--TableViewCell重用机制避免重复显示问题

    常规配置如下 当超过tableView显示的范围的时候 后面显示的内容将会和前面重复 // 这样配置的话超过页面显示的内容会重复出现 - (UITableViewCell *)tableView:(U ...

  5. iOS中下载大型文件的原理解析二

    在iOS中下载大型文件,需要使用NSURLConnection 的代理方法: (void)touchesBegan:(NSSet)touches withEvent:(UIEvent *)event ...

  6. iOS中 UITableViewCell cell划线那些事 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang 在开发中经常遇到cell分割线显示不全或者想自定义线的宽高等; 最近总结了一下,希望帮到大家: 1.不想划线怎么办? Table ...

  7. android 沙盒 ios,iOS中的沙盒机制

    1.应用沙盒结构分析: 应用程序包:(图中的Layer)包含了所有的资源文件和可执行文件 Documents: 保存应用运行时生成的需要出持久化的数据,iTunes同步设备会备份该目录.例如,游戏应用 ...

  8. android storyboard,iOS中xib与storyboard原理,与Android界面布局的异同

    用文本标记语言来进行布局,用的最多的应该是HTML语言.HTML能够理解为有一组特殊标记的XML语言. 一.iOS中xib与storyboard显示原理 在iOS中基本的布置界面的方式有3种:代码.x ...

  9. iOS中的文件管理操作

    转载自 一.iOS中的沙盒机制 iOS应用程序只能对自己创建的文件系统读取文件,这个独立.封闭.安全的空间,叫做沙盒.它一般存放着程序包文件(可执行文件).图片.音频.视频.plist文件.sqlit ...

最新文章

  1. php 500 内部服务器错误,php 500 - 内部服务器错误的解决方法
  2. LiteSeg: 一种用于语义分割的轻量级ConvNet
  3. Python 之 Numpy (五)合并
  4. 【bzoj5082】弗拉格 矩阵乘法
  5. @ConditionalOnMissingBean注解理解
  6. A XSS filter for Java EE web apps--转载
  7. 字符串函数 replace() 方法妙用
  8. Java 集合 之 Vector
  9. 连接linux的几款工具 简介
  10. ios 自动缩小字体_如何避免iOS自动调整字体大小?
  11. python中的raw_input() 与 input() 比较
  12. qrect在图片上显示矩形框_Mac上用LabelImg手动标记图片
  13. 例2.6 Sort - 九度教程第11题(Hash的应用)
  14. win10 蓝牙耳机 连接后输出 没有耳机选择 的 解决办法
  15. JAVA中计算五子棋平局的算法_输入五子棋棋盘判断输赢或平局—程序设计(C语言)...
  16. RationalDMIS 2020 叶片检测 -快速定义叶片截面线方法
  17. 智能停车场车牌识别计费系统
  18. 读书笔记:你在为谁工作
  19. 算法设计与分析5.11求解满足方程解问题
  20. 【小飞象出海】怎么注册海外Google账户

热门文章

  1. 无线路由器说说2.4G和5G Wi-Fi的区别
  2. DetachedCriteria 分页Projection取消聚合条件
  3. GridView中DropDownList联动
  4. WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
  5. JUC多线程核心知识-思维导图
  6. c++ 公有继承的赋值兼容规则
  7. mysql基础命令学习笔记
  8. Java:包的使用Pack
  9. Qt学习之路_1(安装及首次体验)
  10. SugarCRM 主表-自定义字段