一、 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
对象。
原文:http://www.cnblogs.com/wmj520/p/5026619.html