首页 > 移动平台 > 详细

IOS开发ui篇-UITableviewcell的性能问题

时间:2015-12-07 18:31:17      阅读:259      评论:0      收藏:0      [点我收藏+]

一、 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

 对象。

 

IOS开发ui篇-UITableviewcell的性能问题

原文:http://www.cnblogs.com/wmj520/p/5026619.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!