IOS开发ui篇-UITableviewcell的性能问题
一、 UITableView的每一行都市一个UITableViewCell,通过dataSource的 tableview:cellForRowAtIndexPath:方法来初始化每一行
UITableViewCell内部有一个默认的子视图:contentView,contentView是UITableViewCell所显示内容的父视图,可显示一些辅助指示视图
辅助指示视图的作用是显示一个表示动作的图标,可以通过设置UITableviewCell的accessoryType来显示,默认是
UITableViewCellAccessoryDiscloureIndicator
UITableViewCellAccessoryDetailDisclosureButton
UITableViewCellAccessoryCheckmark
还可以用过cell的accessoryView属性来自定义辅助指示视图(比如往右边放一个开关)
二、问题
cell的工作:在程序执行的时候,能看到多少条,它就创建多少条数据,如果视图滚动那么在创建新显示的内容。(系统自动调用)。
当一个cell出现在视野范围内的时候,就会调用创建一个cell。这样的逻辑看上去没有什么问题,但是真的没有任何问题吗?
当创建调用的时候,我们使用nslog打印消息,并打印创建的cell的地址。我们发现如果数据量非常大,用户在短时间内来回滚动的话,
那么会创建大量的cell,一直开辟空间,且如果是往回滚,通过打印地址,我们会发现它没有重用之前已经创建的cell,而是重新创建,开辟
新的存储空间。
那有没有什么好的解决方法呢?
三、cell的重用原理
(1) iOS设备的内存有限,如果用UITableView显示成千上万条数据,就需要成千上万个UITableViewCell对象的话,那将会耗尽iOS
设备的内存。要解决该问题,需要重用UITableViewCell对象
(2)重用原理:当滚动列表时,部分UITableviewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待
重用。当UITableCell,dataSource则会用新的数据来配置这个UITableviewCell,然后返回给UITableView,重新显示到窗口中,从而避免创建对象。
这样可以让创建的cell的数量维持在很低的水平,如果一个窗口中只能显示5个cell,那么cell重用之后,只需要创建6个cell就够了。
(3)注意点:还有一个非常重要的问题:有时候需要自定义UITableViewCell(用一个子类继承UITableViewCell),而且每一行用的不一定是
同一种UITableViewCell,所以一个UITableView可能拥有不同类型的UITableViewCell,对象池中也会有很多不同类型的UITableCell,
那么UITableView在重用用UITableViewCell时可能会得到错误类型的UITableViewCell
解决方案:UITableViewCell有个NSString *reuseIdentifier属性,可以在初始化UITableViewCell的时候传入一个特定的字符串标识
来设置reuseidentifier(一般用UITableViewCell的类别)。当UITableView要求dataSource返回UITableviewCell时,先通过一个字符
串标识到对象池中查找对应类型的UITableViewCell对象,如果有,就重用,如果没有,就传入这个字符串标识来初始化一个UITableViewCell
对象。
转载于:https://www.cnblogs.com/wmj520/p/5026619.html
IOS开发ui篇-UITableviewcell的性能问题相关推荐
- iOS开发UI篇—UITableviewcell的性能优化和缓存机制
iOS开发UI篇-UITableviewcell的性能问题 一.UITableviewcell的一些介绍 UITableView的每一行都是一个UITableViewCell,通过dataSource ...
- iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局
iOS开发UI篇-使用xib自定义UItableviewcell实现一个简单的团购应用界面布局 iOS开发UI篇-使用xib自定义UItableviewcell实现一个简单的团购应用界面布局 一.项目 ...
- iOS开发UI篇—UITableview控件基本使用
iOS开发UI篇-UITableview控件基本使用 一.一个简单的英雄展示程序 NJHero.h文件代码(字典转模型) 1 #import <Foundation/Foundation.h&g ...
- iOS开发UI篇—UITableview控件使用小结
iOS开发UI篇-UITableview控件使用小结 一.UITableview的使用步骤 UITableview的使用就只有简单的三个步骤: 1.告诉一共有多少组数据 方法:- (NSInteger ...
- iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序
iOS开发UI篇-使用嵌套模型完成的一个简单汽车图标展示程序 一.plist文件和项目结构图 说明:这是一个嵌套模型的示例 二.代码示例: YYcarsgroup.h文件代码: 1 //2 // YY ...
- iOS开发UI篇—实现UITableview控件数据刷新
iOS开发UI篇-实现UITableview控件数据刷新 一.项目文件结构和plist文件 二.实现效果 1.说明:这是一个英雄展示界面,点击选中行,可以修改改行英雄的名称(完成数据刷新的操作). 运 ...
- iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一)
iOS开发UI篇-使用UItableview完成一个简单的QQ好友列表(一) 一.项目结构和plist文件 二.实现代码 1.说明: 主控制器直接继承UITableViewController // ...
- iOS开发UI篇-在UItableview中实现加载更多功能
iOS开发UI篇-在UItableview中实现加载更多功能 一.实现效果 点击加载更多按钮,出现一个加载图示,三秒钟后添加两条新的数据. 二.实现代码和说明 当在页面(视图部分)点击加载更多按钮的时 ...
- IOS开发UI篇—导航控制器属性和基本使用
IOS开发UI篇-导航控制器属性和基本使用 一.导航控制器的一些属性和基本使用 1.把子控制器添加到导航控制器中的四种方法 (1) 1.创建一个导航控制器 UINavigationController ...
- android tableview实现多选功能,iOS开发UI篇-tableView在编辑状态下的批量操作(多选)...
先看下效果图 直接上代码 #import "MyController.h" @interface MyController () { UIButton *button; } @pr ...
最新文章
- 结构型模式:装饰模式
- springboot定时任务
- 树莓派做一个dns缓存
- 加速你的IDE !!!送9个固态硬盘(金士顿240G SSD)
- 2017百度之星程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】...
- 【Redis】Redis 使用 redisson 做分布式锁 复盘 maven 依赖 netty 冲突
- 另一种“人老心不老”
- 关于iOS和OS X废弃的API知识点
- IBM核心软件如何应对“互联网+”的技术挑战
- 运算放大电路设计实验
- 虚拟基础架构管理——直接通过 VMware vCenter 管理 NetApp 存储操作
- matlab fspecial disk,Matlab fspecial 用法详述,附示例
- 汽车加油问题 java_汽车加油问题
- 基于卡方分布的独立性检验
- oracle sql 不等 优化6,oracle sql 优化(三)
- 计算机二级ms模拟题在线,全国计算机二级MSoffice高级应用模拟试题及答案
- 【信息学奥赛一本通】题解大全
- 二叉排序树查找成功和不成功的平均查找长度
- 关于固定定位position: fixed;和横向滚动overflow-x: scroll;无法同时使用的问题
- [转载]计算机视觉牛人(转载)(最早在自动化所论坛上发现的)