移动开发需要解决的一个问题就是资源稀缺的问题。多数情况下是内存问题。

虽然现在的手机都号称大内存,高配置。但是移动app所占用的资源也在跟着不断膨胀,

也是造成内存不足的主要原因。

在前面的例子中,还记得我们是怎样创建UITableView的cell的吗?

如果不记得,没有关系,请看下面的代码:

在这个方法调用过程中,每次都会实例化一个UITableViewCell,一个cell代表一个内存地址。

当数据量不是很大的情况下,问题不是很明显。但是如果数据很多的话,那么这个方法在实例化cell的时候就会申请大量的内存,

以满足程序的正常运行。

假如我们有100条数据,那么程序要显示完这100条数据的话,就要向系统申请100个内存地址。

但是如果我们把TableView从顶部滚动到底部,然后再从底部滚回到顶部,内存地址的需求就变为200个。

因为我们都知道,屏幕上每显示一行数据,tableView: cellForRowAtIndexPath:方法就被调用一次。

每次调用都会重新分配内存,这显然不是一个好的实现。apple作为一个非常重视用户体验的公司,不可能不会发觉这个问题的。

UITableViewCell的重用

原理:假如屏幕最多能显示10条数据,当第一次启动程序,这10个内存地址一次分配完成,然后我们向下滚动TableView,

当第一行cell超出屏幕范围不可见后,这个cell所占的地址就可以被重用。如果还不明白的请看下图。

小声的说一下,andriod开发中listview的优化跟ios中UITableView思想基本一样。

TableView提供了下面的方法帮我们达到重用cell的目的:

- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier

UITableView内部维护了一个可重用cell的队列,使用上面的方法,我们可以在该队列中取出可重用的cell。
但是只有当队列中有数据时这个方法才返回UITableViewCell的实例,否则返回nil。因此我们要确保cell被成功初始化。 下面我们重新改造cellForRowAtIndexPath方法 ​ 在viewDidLoad方法中添加下面的代码,该方法能确保
cellForRowAtIndexPath方法中返回的cell不为nil


最后说明一下这个reuseIdentifier的作用,当我们的界面中有多个TableView的时候,
这几个TableView中的cell类型不一定相同,那么就可以使用它来标识我们重用的是哪一种类型的cell。
下面是代码中reuseIdentifier的定义:

【ios开发】UITableViewCell的重用的更多相关文章

  1. iOS开发UITableViewCell的选中时的颜色设置(转)

    iOS开发UITableViewCell的选中时的颜色设置   1.系统默认的颜色设置 //无色 cell.selectionStyle = UITableViewCellSelectionStyle ...

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

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

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

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

  4. 【转】iOS开发UITableViewCell的选中时的颜色设置

    原文网址:http://mobile.51cto.com/hot-404900.htm 1.系统默认的颜色设置 //无色 cell.selectionStyle = UITableViewCellSe ...

  5. iOS开发UITableViewCell的选中时的颜色设置

    1.系统默认的颜色设置 //无色 cell.selectionStyle = UITableViewCellSelectionStyleNone; //蓝色 cell.selectionStyle = ...

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

    事实上这个问题我非常早就想过,仅仅是没有通过去写程序实现,昨天有人提起,我就巧了一下 不知道大家打印郭tableview:cellforrow中cell初始的次数,也就是重用池中的cell个数.这个是 ...

  7. ios基础之UITableViewCell的重用(带示例原创)

    之前一个月刚刚系统的开始接触IOS开发,对UI控件大体了解了一遍,但是因为没有实际的参与项目,对细枝末节的还是不很清楚. 昨天突然想到:UITableViewCell的重用到底是怎么回事,上网查了许多 ...

  8. iOS开发UI篇—UITableviewcell的性能优化和缓存机制

    iOS开发UI篇—UITableviewcell的性能问题 一.UITableviewcell的一些介绍 UITableView的每一行都是一个UITableViewCell,通过dataSource ...

  9. iOS开发UI篇—UITableviewcell的性能问题

    iOS开发UI篇—UITableviewcell的性能问题 一.UITableviewcell的一些介绍 UITableView的每一行都是一个UITableViewCell,通过dataSource ...

随机推荐

  1. C#开发微信门户及应用(10)--在管理系统中同步微信用户分组信息

    在前面几篇文章中,逐步从原有微信的API封装的基础上过渡到微信应用平台管理系统里面,逐步介绍管理系统中的微信数据的界面设计,以及相关的处理操作过程的逻辑和代码,希望从更高一个层次,向大家介绍微信的应用 ...

  2. 细谈Slick(6)- Projection:ProvenShape,强类型的Query结果类型

    在Slick官方文档中描述:连接后台数据库后,需要通过定义Projection,即def * 来进行具体库表列column的选择和排序.通过Projection我们可以选择库表中部分列.也可以增加一些 ...

  3. 《连载 | 物联网框架ServerSuperIO教程》1.4种通讯模式机制。附小文:招.NET开发,结果他转JAVA了,一切都是为了生活

    参考文章: 1.SuperIO通讯框架介绍,含通信本质 2.C#跨平台物联网通讯框架ServerSuperIO(SSIO) 一.感慨 上大学的时候,没有学过C#,花了5块钱在地坛书市买了一本教程,也就 ...

  4. 在js中为图片的src赋值时,src的值不能在开头用 破浪号~

    <img id="aa" src="~/Content/Manager/no01.png" /> document.getElementById(& ...

  5. Web报表工具FineReport填报界面键盘操作

    对于一张填报数据较多的报表,需要用户频繁地操作鼠标.而FineReport填报界面除去按钮类型的控件,其余可以完全使用键盘而不需要用鼠标操作,对于用户而言,这将极大的节省信息录入的时间. 这里我们对填 ...

  6. GridView的各种属性

    <GridView android:id="@+id/movie_list" android:layout_width="906dp" android:l ...

  7. iOS 语音朗读

    //判断版本大于7.0    if ([[[UIDevice currentDevice] systemVersion] integerValue] >= 7.0) {        NSStr ...

  8. 初识Message Queue之--基础篇

    之前我在项目中要用到消息队列相关的技术时,一直让Redis兼职消息队列功能,一个偶然的机会接触到了MSMQ消息队列.秉着技术还是专业的好为原则,对MSMQ进行了学习,以下是我个人的学习笔记. 一.什么 ...

  9. 初识hive

    由facebook 开源用以帮用户解决海量数据etl,构建于hadoop的 数据仓库. 使用hql作为查询接口 使用hdfs作为底层存储 使用mr作为执行层   1.为什么使用hive?      1 ...

  10. [MySQL Reference Manual] 24 MySQL sys框架

    24 MySQL sys框架 24 MySQL sys框架 24.1 sys框架的前提条件 24.2 使用sys框架 24.3 sys框架进度报告 24.4 sys框架的对象 24.4.1所有sys下 ...