2019独角兽企业重金招聘Python工程师标准>>>

解决代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{ NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d%d", [indexPath section], [indexPath row]];//以indexPath来唯一确定cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; //出列可重用的cell
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
//...其他代码
}

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

[cpp]  view plain copy
  1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  2. static NSString *CellIdentifier = [NSString stringWithFormat:@"Cell"];
  3. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  4. if (cell == nil) {
  5. cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
  6. }
  7. //config the cell
  8. return cell;
  9. }

  这里就涉及了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://my.oschina.net/bufenye/blog/162877

IOS Table中Cell的重用reuse机制分析相关推荐

  1. iOS中引用计数内存管理机制分析

    在 iOS 中引用计数是内存的管理方式,虽然在 iOS5 版本中,已经支持了自动引用计数管理模式,但理解它的运行方式有助于我们了解程序的运行原理,有助于 debug 程序. 操作系统的内存管理分成堆和 ...

  2. Android中MediaButtonReceiver广播监听器的机制分析

    转载请注明出处:http://blog.csdn.net/qinjuning 在Android中并没有定义MediaButtonReceive这个广播类,MediaButtonReceive只是作为一 ...

  3. UITableViewCell中cell重用机制导致内容重复的方法

    UITableView继承自UIScrollview,是苹果为我们封装好的一个基于scroll的控件.上面主要是一个个的UITableViewCell,可以让UITableViewCell响应一些点击 ...

  4. ios 如何在cell中去掉_iOS开发:关于 去除UITableViewCell复用机制 的几种方法

    UITableView继承自UIScrollview,是苹果为我们封装好的一个基于scroll的控件.上面主要是一个个的UITableViewCell,可以让UITableViewCell响应一些点击 ...

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

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

  6. 可变cell,自适应cell,理解iOS 8中的Self Sizing Cells和Dynamic Type

    在iOS 8中,苹果引入了UITableView的一项新功能--Self Sizing Cells,对于不少开发者来说这是新SDK中一项非常有用的新功能.在iOS 8之前,如果想在表视图中展示可变高度 ...

  7. VBA读取html表格内容,科学网—VBA读取word文档表格中table的cell的text文本 - 付安民的博文...

    VBA读取word文档表格中table的cell的text文本 已有 11546 次阅读 2010-6-4 16:40 |个人分类:学习篇|系统分类:科研笔记 Sub Readtable() Dim ...

  8. ios代码中的内存泄露,内存检测工具leaks 检测不出来

    iphone开发过程中,代码中的内存泄露我们很容易用内存检测工具leaks 检测出来,并一一改之,但有些是因为ios 的缺陷和用法上的错误,leaks 检测工具并不能检测出来,你只会看到大量的内存被使 ...

  9. iOS 开发中的 Flux 架构模式

    本文讲的是iOS 开发中的 Flux 架构模式, 在半年前,我开始在 PlanGrid iOS 应用程序中采用 Flux 架构(开发).这篇文章将会讨论我们从传统的 MVC 转换到Flux的动机,同时 ...

最新文章

  1. 配置Exchange 2010 服务器(二)Exchange2010证书配置
  2. 原生js.ajax内存溢出,javascript - 代码点火器-如何使用jQuery向数据库提交ajax javascript对象 - 堆栈内存溢出...
  3. 深度学习三(PyTorch物体检测实战)
  4. 【转】C++中的inline用法
  5. pyqtsignal()作用
  6. 学习:SQL Server的复合索引学习(转)
  7. pdf怎么删除其中一页 删除pdf页面的方法
  8. Eclipse Theia:Eclipse的继承者?
  9. getc()、getchar()、getch() 和 getche() 的区别
  10. 在 Half-Life MOD 中创建自己的武器及弹药
  11. 商品历史价格查询网站分享
  12. 2015校园O2O商业模式解析——从物流切入
  13. 均值定理最大值最小值公式_超急关于不等式最大值最小值的求法
  14. 2021online普及组【吃豆人】O(4N)
  15. 首个实时全球空中交通监控系统在北大西洋上空全面投入运行和试用
  16. 如何进行期货日内趋势量化交易系统的设计?
  17. 如何相对高效解决代码测评、训练过程中遇到的 Bug
  18. broyden matlab,Broyden方法求解非线性方程组的Matlab实现
  19. 餐饮水单打印软件_火锅店连锁企业使用哪款生鲜管理系统软件比较好呢?
  20. (原创).net menu click instead of hover 点击显示下一级

热门文章

  1. PowerDesigner 逆向工程 从SQL文件转换成PDM 从PDM转成CDM
  2. RDLC 示例 文章 1
  3. 机票预订系统活动图_软件工程(第五版)--习题及答案技术总结.docx
  4. 设置git协议clone代理
  5. 图解java工程师学习路线
  6. Idea中Terminal中git基本操作
  7. idea查看类和方法的结构图
  8. 【基础】SQL Server系统库的作用
  9. 有一种爱情叫永不改变_设计就像爱情一样,总是在寻找一种方式
  10. 架构师论坛 创业_我在早期创业时作为设计师学到的东西