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. 我常用的VBS方法(QTP)

    这些是4年前在HP用QTP做自动化测试时候总结的一些,现在贴出来,说不准以后会不会用到 当初花了2天时间写的一个自动生成的Excel Report Public Function Report (st ...

  2. [转]Linux的chattr与lsattr命令详解

    转自:http://www.cnblogs.com/yangxia-test/archive/2013/05/24/3096410.html 这两个命令是用来查看和改变文件.目录属性的,与chmod这 ...

  3. Java之--Java语言基础组成(关键字、标识符、注释、常量和变量、运算符)

    Java语言基础组成-关键字.标识符.注释.常量和变量.运算符 Java语言由8个模块构成,分别为:1.关键字:2.标识符(包名.类名.接口名.常量名.变量名等):3.注释:4.常量和变量:5.运算符 ...

  4. 使用java开源工具httpClient及jsoup抓取解析网页数据

    今天做项目的时候遇到这样一个需求,需要在网页上展示今日黄历信息,数据格式如下 公历时间:2016年04月11日 星期一 农历时间:猴年三月初五 天干地支:丙申年 壬辰月 癸亥日 宜:求子 祈福 开光 ...

  5. vector容器使用总结 .xml

    pre{ line-height:1; color:#38ede1; background-color:#5b2814; font-size:16px;}.sysFunc{color:#008080; ...

  6. 安装VMware-tools的问题

    今天晚上解决了之前在跟着 Linux学习之CentOS(六)--CentOS下VMware-Tools安装 解压部分,cp 压缩文件时,没有通过命令,直接鼠标操作复制到/home/ranjiewen下 ...

  7. 代理(Proxy)模式简介

    Proxy 模式简介 代理模式的两个应用: 打开文档时加载大图片 例如:如果有个对象是一张很大的图片,而这张图片需要花费很长时间才能显示出来,那么当这个图片包含在文档中的后面时,使用编辑器或浏览器打开 ...

  8. 阿里云开放服务oss的api

    http://imgs-storage.cdn.aliyuncs.com/help/oss/OSS_API_20131015.pdf?spm=5176.383663.5.23.JQjiIK&f ...

  9. PartialView

    一.客户端直接请求分部视图(如使用AJAX) Return PartialView()  不加载布局页面,不执行_ViewStart.cshtml AJAX  /Home/LoginPart 二.视图 ...

  10. Gridheh 垂直居中

    Gridheh 垂直居中 上下居中 each columns  set layout ColumnDefValues.Layout = tlCenter 有colResize,拖动调整列宽. 但是没有 ...