【问题标题】:Memory Handling for thumbnail images in UITableViewCellsUITableViewCells 中缩略图的内存处理
【发布时间】:2012-03-10 04:28:17
【问题描述】:

简短说明

目前我有一个 UITableView,其中包含来自网站的视频单元格。此外,每个单元格(代表一个视频)都有一个特定的缩略图。这些图像是使用 NSURLConnection 异步下载的(所以我不必担心自己的线程)。当这些图像对象下载完毕后,它们只是通知 UITableView 刷新它所属的单元格。

我的问题

作为标准,每次调用都会向 UITableView 提取 10 个新视频。这意味着允许用户在 UITableView 底部推送一个单元格来请求 10 个新视频等等。这里的问题是很快就会占用大量内存,因为无论如何(在 UITableView 中)所有缩略图图像的数据仍然存在。

是否有一种聪明的方法可以取消分配当前不在视图中的图像对象?

此外,UITableView 只是直接从我拥有的从网站获取的所有视频对象的数组中呈现其所有单元格。这意味着用户可以请求新视频的次数没有限制,从而使这个数组一直越来越大。将这些类型的数组一直保存在内存中是否正确?还是应该删除那些不在视图中的,然后再请求它们?

提前谢谢你

【问题讨论】:

    标签: iphone ios ipad uitableview memory-management


    【解决方案1】:

    如果您创建自己的 VideoTableViewCell 类作为 UITableViewCell 的子类,并为单元格提供图像属性,则该图像将在单元格离开屏幕后立即释放。单元格和图像将在单元格返回视图后立即重新创建。

    对于视频,我会将所有下载的视频文件存储在文档文件夹中,并将 URL 存储在一个数组中。如果单元格可见或被点击,只需从硬盘加载文件即可。

    【讨论】:

      【解决方案2】:

      如果您在表格视图中使用对单元格进行排队和出队的标准方法,那么您真的应该只使用少数单元格视图(及其相关缩略图) - 例如,单元格视图的总数分配的数量不应超过屏幕上可查看的最大数量,并且通过扩展,分配/引用缩略图的数量不应超过单元格的总数。每次呈现代表新电影的行时,imageview 就像新的一样被重用。

      您要考虑的是,您的数据数组(您下载的剪辑的数组,其中可能包含无限的对象)与 tableview 的单元格数组完全分离,这将是一个相对较小的数字。

      我的建议是设想一个图像的下载缓存。基本上,当您的缩略图被下载时,为每个缩略图分配一个唯一的字符串 id,然后将实际的图像文件写入磁盘。将唯一 ID 字符串分配给您的模型对象。当您的 tableview 准备呈现图像时,使用 id 字符串定位单元格的图像,从磁盘加载图像,并填充图像视图。只要您不保留图像,就应该在呈现图像的单元格离开屏幕时释放图像。您还可以在内存不足的情况下清空已加载图像的缓存。

      【讨论】:

      • 感谢您的努力,但还是选择了简单的版本:)
      • 当然。这几乎是相同的答案;无论您的图像被分配给通用还是自定义单元子类,您的图像都将被释放。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      • 2014-11-11
      • 2016-12-15
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多