-
TableView
重用机制及常见问题
摘
要:<
/p>
IOS
是运行在苹果移动设备上的操作系统,
它
对内存的控制比较严格。
Tableview
是在
IOS
开发过程中使
用的最为广泛的控件之一,常用来以列表的方式显示资料。
为了解决内存消耗问题,
p>
TableView
重用机制发挥着重要的
作用。本文对
TableView
重用机制进行了详细介绍,并
指出
了开发过程中常见的问题。针对这个问题,本文给出了两种
解决方案,
并通过内存消耗和
CPU
占
有率这这个指标进行对
比,得出了第二种方案的更为有效的结论。
关
键词:
TableView
重用机制;内存消耗;解决方案
p>
IOS
是由苹果公司为
iphone
开发的操作系统。
它主要是
iphone
、
iPod touch
以及
< br>iPad
使用。
就像
Mac
OS X
操作系统
一样,
它也是以
p>
Darwin
为基础的。
最新版的
IOS
系统
(
IOS8
)
中,系统操作占用大概
1.1G
p>
的内存空间
.
后续的系统预计将
占用更多的内存。另外,
IOS
设备提供给每个应
用软件使用
的内存是有限的
[1]
。因
此,
IOS
对开发者进行内存管理的要
求很严格,对于易于崩溃、有内存泄露、以及内存占用量过
大的程序,都不能通过苹果公
司的审核。因此,
IOS
应用软
件的开
发过程中,内存控制需要时刻注意。
1
TableView
的简介
TableView
是
APP
开发中使用率最高的一个常用控件,
基本上每个
view
都会见到它的身影。
p>
TableView
功能很强大,
除了一般
的表格资料展示之外,设置的属性资料往往也用到
TableView
< br>。
无论是
IOS
设备自带的通讯
录、
备忘录、
提醒事
项等应用软件,还
是第三方的微信、微博、陌陌等社交软件
[2]
,都使用了这个
视图。
TableView
继承自
Sc
rollView
,可
以表现为
Pla
in
和
Grouped
两种风格:
p>
Plain
样式指的是普通
的列表风格,<
/p>
是方形的外观;
Grouped
样式指的
是分块风格,
主要以圆角形显示。
在
Tab
leView
中的一行称为
TableViewCell
,而许多的
TableViewCell
组成
了一个
TableSection
,每个
TableSection
上下又分
?e
有
Header
和
Footer<
/p>
,
许多个的
Table Section
则组
成了整个
Table
,
Table
也有
Hea
der
和
Footer
。
TableViewCell
是
TableView
基本组成单元。
2
TableView
的重用机制
在
IOS
的一些视图中,它们的内部包含子视图,当父视
图显示区域发生
变化时,比如用手滑动屏幕,原来在屏幕中
的子视图就会滑出到屏幕之外,而原来在屏幕
之外的子视图
就有机会进入屏幕中
[4]
。就如上文所述
TableView
常用于资
料的显示,如果一个
TableView
有几百个
p>
TableViewCell
,根
据数据个
数创建相应数量
TableViewCell
,
会占用很大的内存
空间
[3]
。如果在
TableViewCell
里面含有
image
之类的很占
内存的资源,这就会造成应用程
序在使用
TableView
加载大
批
量数据时内存占用过大,那这样很容易出现内存警告甚至
崩溃掉,这不是我们想要看到的
。因此,
TableView
提供了
单
元格重用机制来达到节省内存的目的:通过为每个单元格
指定一个重用标识符
(
reuseIdentifier
)
,
即指定了单元格的种
类;当单元格滚出屏幕时,
允许恢复单元格以便重用。
TableView
自我管理的重用
方法
dequeueReusableCellWithIdentifier
,
这个方法列一个已经存在
的单元格,
假如没有可以重用的单元格那么就返回
nil
。
合理
的使用重用机制会对程序的内存使用和优化都有很重要的<
/p>
作用。
查看
TableView
头文件,会找
NSMutableArray
*
visiableCells
和
NSMutableDictn
ery *reusableTableCells
两个
结构。
visiableCells
内保存当前显示的
cells
,
reusableTableCells
保存可重用的
cells
。
TableView
显示之初,
reusable
TableCells
为空,那么
tableView deq
ueueReusableCellWithIdentifier
:
< br>CellIdentifier
返回
nil
。
开始的
cell
都是通过
[[UITableViewCell
alloc] ini
tWithStyle
:
UITableViewCellSt
yleDefault
reuseIdentifier
:<
/p>
CellIdentifier]
来创建,而且
< br>cellForRowAtIndexPath
只是调用最大显示
cell
数的次数。
比如:有
100
条数据,
iphone
一屏最多
显示
10
个
cell
< br>。
程序最开始显示
TableView
< br>的情况是:
⑴用
[[UITableViewCell alloc] i
nitWithStyle
:
UITableViewCell
StyleDefault reuseIdentifier
:
CellIdentifier]
创
建
10
次
cell
,并给
cell
指定同样的重用标识(当然,可以为
不同显
示类型的
cell
指定不同的标识)
。
并且
10
个
cell
< br>全部
都加入到
visiableCells
的队列,
reusableTableCells
为
空。
⑵向上拖动
tableView
,
p>
当
cell1
完全移出屏幕,
并且
cell11
完全显示出来的时候。
cell11
加入到
visiableCells
,
cell1
移出
visiableCells
,
cell1
加入到
reusableTableCells
。
p>
⑶接着向上拖动
tableView
,
因为
reusableTableCells
中
已
经有值,
所以,
当需要显示新的
p>
cell
,
cellForRowAtIn
dexPath
再次被调用的时候,
tableView
p>
dequeueReusableCellWithIdentifier
< br>:
CellIdentifier
,
返回
cell1
。
cell1
p>
加入到
visiableCells
,
p>
cell1
移出
reusableTabl
eCells
;
cell2
移出
visiableCells
,
cell2<
/p>
加入到
reusableTableCells
< br>。
之后再需
要显示的
Cell<
/p>
就可以正常重用了。
合理的使用重用机制会对
程序的内存使用和优化都有很重要的作用。
3
视图
重叠的问题
在
p>
TableViewCell
中加入
Tex
tField
或者
TextView
等
子视
图,
便可以在
cell
上进行文字编辑。
但对于多变的自定义
cell<
/p>
,
如当一个
cell
含有一个
UITextField
的子类并被放在重用队列
中以待重用,这时如果一个未包含任何子视图的
cell
要显示
在屏幕上,就会取出并使用这个重用的
cell
显示在无任何子
视图的
cel
l
中,这个时候就会出现问题。
-
-
-
-
-
-
-
-
-
上一篇:选光耦笔记
下一篇:英语四级全真预测试卷及答案-阅读