UITableView的单元格在不可见时释放

时间:2011-12-29 16:40:05

标签: iphone objective-c ios uitableview

我有一个UITableView。每一行都是重物,有视频,图像等。 当用户滚动此视图时,如何释放不可见行的内存并加载当前可见行?

4 个答案:

答案 0 :(得分:6)

我假设您正在谈论释放行所使用的图像和视频所使用的内存,而不是行本身。

在你的tableview委托中,

 -(void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView

告诉您桌面滚动何时停止。

 [myTableView indexPathsForVisibleRows]

为您提供可见内容的数组。

如果您的行不在此数组中,则该行不可见,您可以对其进行图像/视频清理。

答案 1 :(得分:2)

您是否按照Apple的建议回收UITableViewCells?如果没有,你必须阅读Apple的文档。在cellForRowAtIndexPath:委托内你应该有[customCell setMediaObjects:]。在customCell类中,您可以从内存中释放所有以前的mediaObject。

答案 2 :(得分:2)

正如其他人所说的那样,你应该确保你正确地回收细胞,而不是在细胞被重复使用时破坏你需要重建的东西。

但是,您可能希望释放单元格或其视图保留的其他资产。或者,如果该单元格有任何挂起的下载请求,例如,您可能希望重置其优先级,甚至在单元格在屏幕外时取消它们。

我认为最简洁的方法是覆盖-[UITableViewCell prepareForReuse]

当单元格放回重用队列时调用此方法。如果用户快速上下移动表格,您可能不希望在单元格离开屏幕时清理单元格(例如,通过查看indexPathsForVisibleRows)。

但是当单元格实际放回重用队列时,这是完成这项工作的好时机,因为你知道在你出列并再次配置它之前,单元格不会再出现在屏幕上。

答案 3 :(得分:1)

A Closer Look at Table-View Cells - Apple Documentation

当您第一次调用dequeueReusableCellWithIdentifier时(一次只能在屏幕上显示10个单元格),将创建单元格,然后将加载并配置它们以进行显示。 因此,细胞不会被释放。