程序员iOStableviewcell寒哥管理的技术专题

UITableViewCell的重用

2015-10-23  本文已影响5073人  ForeverYoung21

UITableViewCell如果在tableView:cellForRowAtIndexPath:方法中,像其他类一样,使用下面的方式创建:

UITableViewCell *cell = [[UITableViewCell alloc] init];
cell.textLabel.text = @"hello";
...

这样虽然能正确显示,但是性能是有问题的。

苹果实际上是帮我们提高了性能了的。假设要显示200行数据,如果同时创建200个cell,那么无疑会非常消耗性能,并且并没有太大的意义——因为有些cell根本还没有显示出来。

所以在使用UITableView的时候,只有在cell即将显示的时候才会调用tableView:cellForRowAtIndexPath:方法,也就是说,如果有200行数据,那么只会创建我们可以看到的cell,而那些看不到的数据,则不会创建对应的cell。

比如在手机屏幕上可以同时显示5个cell(编号为0 - 4),那么当用户向上滑tableView的时候,第6个cell即将出现,而第1个cell还未消失,所以此时会创建6个UITableViewCell。当第7个cell出现,那么第1个cell就会完全从屏幕上消失,此时这个UITableViewCell的对象将被销毁,并且第7个cell被创建。以此类推,当有新的cell出现,那么就会创建一个新的cell,销毁消失的那个cell。

这样虽然不必同时创建200个cell,但是在不断地创建-销毁cell,性能上依然会有问题。

苹果提供的更好的方法是将cell复用,而不是销毁。

每次有新的cell出现的时候(也就是tableView:cellForRowAtIndexPath:方法执行的时候),不应该直接创建一个cell,而是应该去缓冲池中查找有没有可复用的cell,如果有,那么就重用这个cell;如果没有,则创建一个cell。这样无论数据是200行,2000行还是20000行,实际上创建的只是屏幕可见的cell的个数

还是上面的例子,当第7个cell即将出现,第1个cell消失,此时并不会销毁第一个cell,而是将它放入缓冲池中等待复用。此时第7个cell会首先去缓冲池中寻找是否有可复用的cell,发现有(就是消失的第1个cell),那么就会拿来复用,而不是重新创建。这样一来,消失一个,下次就会重用这个,这样就可以保证创建最少数量的cell,仍然可以满足需求。

实现cell的重用可以采用下面的方法:

上一篇 下一篇

猜你喜欢

热点阅读