【ios开发】UITableViewCell的重用
移动开发需要解决的一个问题就是资源稀缺的问题。多数情况下是内存问题。
虽然现在的手机都号称大内存,高配置。但是移动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的重用的更多相关文章
- iOS开发UITableViewCell的选中时的颜色设置(转)
iOS开发UITableViewCell的选中时的颜色设置 1.系统默认的颜色设置 //无色 cell.selectionStyle = UITableViewCellSelectionStyle ...
- IOS中UITableViewCell的重用机制原理
创建UITableViewController子类的实例后,IDE生成的代码中有如下段落: - (UITableViewCell *)tableView:(UITableView *)tableVie ...
- iOS开发之--TableViewCell重用机制避免重复显示问题
常规配置如下 当超过tableView显示的范围的时候 后面显示的内容将会和前面重复 // 这样配置的话超过页面显示的内容会重复出现 - (UITableViewCell *)tableView:(U ...
- 【转】iOS开发UITableViewCell的选中时的颜色设置
原文网址:http://mobile.51cto.com/hot-404900.htm 1.系统默认的颜色设置 //无色 cell.selectionStyle = UITableViewCellSe ...
- iOS开发UITableViewCell的选中时的颜色设置
1.系统默认的颜色设置 //无色 cell.selectionStyle = UITableViewCellSelectionStyleNone; //蓝色 cell.selectionStyle = ...
- iOS开发-自己定义重用机制给ScrollerView加入子视图
事实上这个问题我非常早就想过,仅仅是没有通过去写程序实现,昨天有人提起,我就巧了一下 不知道大家打印郭tableview:cellforrow中cell初始的次数,也就是重用池中的cell个数.这个是 ...
- ios基础之UITableViewCell的重用(带示例原创)
之前一个月刚刚系统的开始接触IOS开发,对UI控件大体了解了一遍,但是因为没有实际的参与项目,对细枝末节的还是不很清楚. 昨天突然想到:UITableViewCell的重用到底是怎么回事,上网查了许多 ...
- iOS开发UI篇—UITableviewcell的性能优化和缓存机制
iOS开发UI篇—UITableviewcell的性能问题 一.UITableviewcell的一些介绍 UITableView的每一行都是一个UITableViewCell,通过dataSource ...
- iOS开发UI篇—UITableviewcell的性能问题
iOS开发UI篇—UITableviewcell的性能问题 一.UITableviewcell的一些介绍 UITableView的每一行都是一个UITableViewCell,通过dataSource ...
随机推荐
- DNS报文格式(RFC1035)
一.域名和资源记录的定义 1.Name space definitions 2.资源记录定义(RR definitions) 2.1 格式 后面分析报文的时候详细解释. ...
- 【WPF】ChartControl的使用
一.前言 本月正好做一些关于工程4D,5D的界面展示,正好要用到Dev控件中的ChartControl控件,也就是图表控件. 折腾了两星期完成了一个比较能说的过去的界面吧.(领导要求高,可 ...
- 在docker容器中vi指令找不到
在使用docker容器时,有时候里边没有安装vi,敲vi命令时提示说:vi: command not found,这个时候就需要安装vi,可是当你敲apt-get install vi命令时,提示: ...
- 新手,Visual Studio 2015 配置Boost库,如何编译和选择,遇到无法打开文件“libboost_thread-vc140-mt-gd-1_63.lib“的解决办法
1,到官网下载最新的boost,www.boost.org 这里我下载的1-63版本. 2,安装,解压后运行bootstrap.bat文件.稍等一小会就OK. 3,编译boost库.注意一定要使用VS ...
- dpkg:处理软件包dradis (--configure)时出错
dpkg:处理软件包dradis (--configure)时出错!解决方案:1.将info文件夹更名%mv /var/lib/dpkg/info /var/lib/dpkg/info_old2.新建 ...
- C - NP-Hard Problem(二分图判定-染色法)
C - NP-Hard Problem Crawling in process... Crawling failed Time Limit:2000MS Memory Limit:262144 ...
- 服务发现与健康监测框架Consul-DNS转发的应用
关于Consul Consul是一个提供服务注册与发现,健康监测,Key/Value存储以及多数据中心存储的分布式框架.官网地址是https://www.consul.io/,公司初步应用后我们老大觉 ...
- Qt 中使用Singleton模式需小心
在qt中,使用Singleton模式时一定要小心.因为Singleton模式中使用的是静态对象,静态对象是直到程序结束才被释放的,然而,一旦把该静态对象纳入了Qt的父子对象体系,就会导致不明确的行为. ...
- 升级Centos的python为2.7(centos python 升级)
1.首先下载python的2.7.8版本的tar包.为什么没有选择最新版本的3.4呢?因为3版本的兼容性不好.很多一些成熟的项目都是基于2.7开发的. https://www.python.org/d ...
- java 中抽象类和接口的五点区别?
1.一个类可以实现多个接口 ,但却只能继承最多一个抽象类. 2.抽象类可以包含具体的方法 , 接口的所有方法都是抽象的. 3.抽象类可以声明和使用字段 ,接口则不能,但接口可以创建静态的final常量 ...
在viewDidLoad方法中添加下面的代码,该方法能确保