【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 ...
随机推荐
- C#开发微信门户及应用(10)--在管理系统中同步微信用户分组信息
在前面几篇文章中,逐步从原有微信的API封装的基础上过渡到微信应用平台管理系统里面,逐步介绍管理系统中的微信数据的界面设计,以及相关的处理操作过程的逻辑和代码,希望从更高一个层次,向大家介绍微信的应用 ...
- 细谈Slick(6)- Projection:ProvenShape,强类型的Query结果类型
在Slick官方文档中描述:连接后台数据库后,需要通过定义Projection,即def * 来进行具体库表列column的选择和排序.通过Projection我们可以选择库表中部分列.也可以增加一些 ...
- 《连载 | 物联网框架ServerSuperIO教程》1.4种通讯模式机制。附小文:招.NET开发,结果他转JAVA了,一切都是为了生活
参考文章: 1.SuperIO通讯框架介绍,含通信本质 2.C#跨平台物联网通讯框架ServerSuperIO(SSIO) 一.感慨 上大学的时候,没有学过C#,花了5块钱在地坛书市买了一本教程,也就 ...
- 在js中为图片的src赋值时,src的值不能在开头用 破浪号~
<img id="aa" src="~/Content/Manager/no01.png" /> document.getElementById(& ...
- Web报表工具FineReport填报界面键盘操作
对于一张填报数据较多的报表,需要用户频繁地操作鼠标.而FineReport填报界面除去按钮类型的控件,其余可以完全使用键盘而不需要用鼠标操作,对于用户而言,这将极大的节省信息录入的时间. 这里我们对填 ...
- GridView的各种属性
<GridView android:id="@+id/movie_list" android:layout_width="906dp" android:l ...
- iOS 语音朗读
//判断版本大于7.0 if ([[[UIDevice currentDevice] systemVersion] integerValue] >= 7.0) { NSStr ...
- 初识Message Queue之--基础篇
之前我在项目中要用到消息队列相关的技术时,一直让Redis兼职消息队列功能,一个偶然的机会接触到了MSMQ消息队列.秉着技术还是专业的好为原则,对MSMQ进行了学习,以下是我个人的学习笔记. 一.什么 ...
- 初识hive
由facebook 开源用以帮用户解决海量数据etl,构建于hadoop的 数据仓库. 使用hql作为查询接口 使用hdfs作为底层存储 使用mr作为执行层 1.为什么使用hive? 1 ...
- [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下 ...