UITableView是iOS开发中使用频率非常高的一个控件,它常被用来展示信息列表,尽管信息数据可能非常多,但UITableView消耗的资源却并不会随着展示信息的增多而变大,这都要得益于UITableViewCell的重用机制,重用机制:顾名思义,就是反复利用资源的机制。以下通过一些代码来看下通常我们创建UITableViewCell的方式

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath

{

static NSString *cellIdentifier =@"NormalCell";

UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier: cellIdentifier];

if (!cell) {

cell = [[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier: cellIdentifier];

}

//处理逻辑

return cell;

}

如上所看到的,通常我们会调用UITableViewCell*cell = [tableView dequeueReusableCellWithIdentifier: cellIdentifier];语句来获取标识为@"NormalCell"的可重用的cell,假设有标识为@"NormalCell"的cell,则返回一个cell;否则返回nil。若上面语句的返回值为nil,我们就须要创建一个新cell。上面这样的获取cell的方式即是UITableViewCell的重用机制。举个形象样例:当前的UITableView一次最多可显示8个cell,我们有100个cell须要显示出来,那么当UITableView初始化时显示的是1-8的cell,这时候没有可重用的cell,所以每一个cell都须要新建,当我们把UITableView向上拖动,这时候第1个cell尚未全然离开可见视图,第9个cell须要显示部分,这时也是没有可重用的cell,所以第9个cell也是须要新建的,当第1个cell全然离开可见视图后即被回收回去标记为可重用,如今当须要显示第10个cell时就可以获取到可重用的cell,所以第10个cell是不须要新建的,它使用的即是被回收的第1个cell,后面的以此类推,所以展示100个cell仅仅须要新建9个cell就能够了。

结合网络资料及iOS的SDK能够猜測UITableViewCell的重用机制是这样实现的:

在UITableView中应该有一个可变字典来存储可重用的cell:NSMutableDictionary*reusableTableCells;在UITableView刚初始化的时候reusableTableCells中的内容为空,当有cell离开可见视图时,系统就会依据cell的可重用标识把cell存储到reusableTableCells中,实现方式类似例如以下代码:

-(void)addReusebleCell:(UITableViewCell *)cell

{

NSString *reuseIdentifier =cell.reuseIdentifier;

NSMutableSet *reuseCellSet = [reusableTableCellsobjectForKey:reuseIdentifier];

if (!reuseCellSet) {

reuseCellSet = [[NSMutableSetalloc]init];

}

[reuseCellSet addObject:cell];

[reusableTableCells setObject:reuseCellSetforKey:reuseIdentifier];

}

获取可重用cell的方法- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier的实现方式类似例如以下代码:

-(id)dequeueReusableCellWithIdentifier:(NSString *)identifier

{

NSMutableSet *reuseCellSet =[reusableTableCells objectForKey:identifier];

if (reuseCellSet.count == 0) {

return nil;

}

id anyObject = [reuseCellSet anyObject];

[reuseCellSet removeObject:anyObject];

return anyObject;

}

至此,UITableViewCell的重用机制的解说完成。

UITableViewCell重用机制的更多相关文章

  1. 禁用UITableViewCell 重用机制

    有时候不想让Cell重用,怎么办勒.接下来介绍两种方法 方法一 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAt ...

  2. ios UITableViewCell重用问题

    在写sina 微博界面的过程中使用到了cell,那么就是在cell上添加一些控件,但是由于每条微博的内容都是不同的,所以在显示的过程中,出现了内容重叠的问题,其实就是UITableViewCell重用 ...

  3. UITableViewCell的重用机制

    UITabelView一般会显示大量数据,如果有多少条数据就新建多少个cell,那么对于内存来说是种极大的负担,这样自然是不合理的,所以才会有重用机制 比如一个家庭办酒席,一共有13桌,每桌20个菜, ...

  4. UITableViewCell的重用机制原理

    UITableViewCell的重用机制原理 来自http://blog.csdn.net/omegayy/article/details/7356823 ====================== ...

  5. IOS中UITableViewCell的重用机制原理

    创建UITableViewController子类的实例后,IDE生成的代码中有如下段落: - (UITableViewCell *)tableView:(UITableView *)tableVie ...

  6. iOS - UITableView中Cell重用机制导致Cell内容出错的解决办法

    "UITableView" iOS开发中重量级的控件之一;在日常开发中我们大多数会选择自定Cell来满足自己开发中的需求, 但是有些时候Cell也是可以不自定义的(比如某一个简单的 ...

  7. iOS--cell的重用机制

    对于像我们这样的初学者来说,cell重用机制是很难理解的内容,所以我们不一定非得理解,会用就行. cell的重用机制:当我们使用tableView时,系统只会创建屏幕中显示的cell的个数+1,当ce ...

  8. 你真的了解UITableViewCell重用吗?

    一:首先查看一下关于UITableViewCell重用的定义 - (nullable __kindof UITableViewCell *)dequeueReusableCellWithIdentif ...

  9. tableview的重用机制(面试必问)

    iphone重用机制是苹果为了实现大量数据显示而采用的一种节省内存的机制,比如在UITableView和ScrollView 等地方.为什么要“可重用”???对于我们的项目来说,内存控制是必不可少的, ...

随机推荐

  1. selenium python (五)打印信息及设置等待时间

    #!/usr/bin/python# -*- coding: utf-8 -*-__author__ = 'zuoanvip' #一般情况下我们要验证打开的页面是否正确,可通过网页的Title和Cur ...

  2. php 页面参数过多时自动拼接get参数的函数

    function getUri($query){ $request_uri = $_SERVER["REQUEST_URI"]; $url = strstr($request_ur ...

  3. FreeMarker笔记 第二章 数值和类型

    2.1 基本内容 2.1.1 简介 2.1.2 什么是数值 和程序语言中的数值类型是相似的. 2.1.3 什么是类型? 2.1.4 数据模型是哈希表 2.2 类型 2.2.1 简介 2.2.2 标量 ...

  4. n个数的最小公倍数

    Description 求n个数的最小公倍数.   Input 输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数.   Output 为每组测试数据输出它们的最小公倍数,每个测 ...

  5. ListView真的蛮好用

    老规矩,今晚学过的,明天,依靠回忆写出来. 打个卡,占个版面.

  6. pthread_cond_timedwait时间设置

    最近工作中需要在ACodec中起一个pthread,并每间隔100ms统计一次buffer的状态,在程序中使用pthread_cond_timedwait来设置时间间隔,但在使用中发现当超时时间设置成 ...

  7. webservice注释

    @WebService 1.serviceName: 对外发布的服务名,指定 Web Service 的服务名称:wsdl:service.缺省值为 Java 类的简单名称 + Service.(字符 ...

  8. .NET在IE9中页面间URL传递中文变成乱码的解决办法

     在.Net的项目中,鼠标点击查询按钮,转到查询页面,但URL中包含中文时,传到服务器端后,中文变成了乱码(只有IE9出现该问题).       尝试使用Server.UrlEncode()进行编码, ...

  9. centos 7搭建vpn(pptpd)服务器 (只限centos 7)

    第一步:首先检查ppp是否开启  若使用XEN构架的VPS,此步骤不用执行 终端输入命令:cat /dev/ppp 开启成功的标志:No such file or directory 或者 No su ...

  10. CircleLayout

    CircleLayout https://developer.apple.com/library/ios/samplecode/CircleLayout/Introduction/Intro.html ...