移动开发需要解决的一个问题就是资源稀缺的问题。多数情况下是内存问题。

虽然现在的手机都号称大内存,高配置。但是移动app所占用的资源也在跟着不断膨胀,

也是造成内存不足的主要原因。

在前面的例子中,还记得我们是怎样创建UITableView的cell的吗?

如果不记得,没有关系,请看下面的代码:

【ios开发】UITableViewCell的重用-LMLPHP

【ios开发】UITableViewCell的重用-LMLPHP

在这个方法调用过程中,每次都会实例化一个UITableViewCell,一个cell代表一个内存地址。

当数据量不是很大的情况下,问题不是很明显。但是如果数据很多的话,那么这个方法在实例化cell的时候就会申请大量的内存,

以满足程序的正常运行。

假如我们有100条数据,那么程序要显示完这100条数据的话,就要向系统申请100个内存地址。

但是如果我们把TableView从顶部滚动到底部,然后再从底部滚回到顶部,内存地址的需求就变为200个。

因为我们都知道,屏幕上每显示一行数据,tableView: cellForRowAtIndexPath:方法就被调用一次。

每次调用都会重新分配内存,这显然不是一个好的实现。apple作为一个非常重视用户体验的公司,不可能不会发觉这个问题的。

UITableViewCell的重用

原理:假如屏幕最多能显示10条数据,当第一次启动程序,这10个内存地址一次分配完成,然后我们向下滚动TableView,

当第一行cell超出屏幕范围不可见后,这个cell所占的地址就可以被重用。如果还不明白的请看下图。

小声的说一下,andriod开发中listview的优化跟ios中UITableView思想基本一样。

【ios开发】UITableViewCell的重用-LMLPHP

【ios开发】UITableViewCell的重用-LMLPHP

TableView提供了下面的方法帮我们达到重用cell的目的:

- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier

UITableView内部维护了一个可重用cell的队列,使用上面的方法,我们可以在该队列中取出可重用的cell。
但是只有当队列中有数据时这个方法才返回UITableViewCell的实例,否则返回nil。因此我们要确保cell被成功初始化。 下面我们重新改造cellForRowAtIndexPath方法 ​【ios开发】UITableViewCell的重用-LMLPHP 在viewDidLoad方法中添加下面的代码,该方法能确保
cellForRowAtIndexPath方法中返回的cell不为nil
【ios开发】UITableViewCell的重用-LMLPHP

最后说明一下这个reuseIdentifier的作用,当我们的界面中有多个TableView的时候,
这几个TableView中的cell类型不一定相同,那么就可以使用它来标识我们重用的是哪一种类型的cell。
下面是代码中reuseIdentifier的定义:
【ios开发】UITableViewCell的重用-LMLPHP
05-08 08:20