众所周知UITableView的每一行都是一个UITableViewCell,通过dataSource的 tableView:cellForRowAtIndexPath:方法来初始化每⼀行,在程序执行的时候,能看到多少条,它就创建多少条数据,如果视图滚动那么再创建新显示的内容。(系统自动调用)。即当一个cell出现在视野范围内的时候,就会调用创建一个cell。这样的逻辑看上去没有什么问题,但是真的没有任何问题吗?
当创建调用的时候,我们使用nslog打印消息,并打印创建的cell的地址。我们发现如果数据量非常大,用户在短时间内来回滚动的话,那么会创建大量的cell,一直开辟空间,且如果是往回滚,通过打印地址,我们会发现它并没有重用之前已经创建的cell,而是重新创建,开辟新的存储空间。这样就浪费很大的资源,况且效率非常低。iOS设备的内存有限,如果用UITableView显示成千上万条数据,就需要成千上万 个UITableViewCell对象的话,那将会耗尽iOS设备的内存。况且系统绝对不会让我们把内存资源用完的,当我们的软件内存占用到一定的比例后,系统就会把我们的软件杀掉。
那有没有什么好的解决办法呢?
要解决该问题,需要重用UITableViewCell对象。重用原理:当程序运行时候,需要创建TabelVeiwCell,比如我们的界面只需要4个半cell就能填充满,那么系统就先创建5个cell 当我们往上滑的时候接着会创建第6个,继续往上划,这时候如果第一个cell划出屏幕,但它并没有消失,而是被放到一个复用池中,当继续向上滑动的时候,第七个将要被创建的时候,dataSource会在复用池中查找是否有闲置的cell 如果有那么就会对cell进行重新赋值,显示到界面上,往下依次循环,也就是说我们显示多个cell其实就创建了7个cell,是他们的不断复用达到我们显示N多个的效果。。
dataSource如何知道复用池中闲置的cell与我们接下来创建的是不是同一种呢,那么就要说到reuseIdentifier了 。UITableViewCell有个NSString *reuseIdentifier属性,可以在初始化UITableViewCell的时候传入一个特定的字符串标识来设置reuseIdentifier(一般用UITableViewCell的类名)。当UITableView要求dataSource返回UITableViewCell时,先 通过一个字符串标识到对象池中查找对应类型的UITableViewCell对象,如果有,就重用,如果没有,就传入这个字符串标识来初始化一个UITableViewCell对象。这样就可以实现tabelView中显示不同的cell了(通过不同的标识符来创建和复用)。
网友评论