2012-02-19 42 views
2

简短说明UITableViewCells中的缩略图图像的内存处理

目前我有一个包含网站视频单元格的UITableView。另外,每个单元格(代表一个视频)都有一个特定的缩略图图像。这些图像使用NSURLConnection异步下载(所以我不必担心自己穿线)。当这些图像对象已经下载时,他们只需通知UITableView刷新它所属的单元。

我的问题

由于标准也会有进账10部新影片的UITableView的每个呼叫。这意味着用户被允许推送UITableView底部的一个单元来请求10个新视频等等。这里的问题是很快就会出现大量的内存使用情况,因为无论如何,所有缩略图图像(在UITableView中)的数据仍然存在。

是否有一种智能的方式可以取消当前不在视图中的图像对象?

此外,UITableView直接从我从网站中获取的所有视频对象的数组中直接渲染其所有单元格。这意味着用户可以请求新视频的次数没有限制,从而使阵列始终变得越来越大。将这些数组始终保存在内存中是正确的吗?或者,你应该删除那些从视图中删除并稍后再次请求的视图?

预先感谢您

回答

0

如果您创建自己的类VideoTableViewCell作为UITableViewCell的子类,并且您为单元格指定了图像的属性,那么只要单元格离开屏幕,该图像就会被释放。一旦Cell返回视图,单元和图像将被重新创建。

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

+0

简单和工作,谢谢:) – Luffen 2012-02-19 17:39:35

1

如果您使用的排队,并在您的tableview去排队细胞的标准方法的方法,那么你真的应该只使用细胞意见(及其相关的缩略图)少数 - 例如,分配的单元格视图总数不应超过屏幕上可查看的最大数量,并且通过扩展,分配/引用缩略图图像的数量不应超过单元总数。每次您呈现表示新电影的行时,imageview都可能会重用,因为它是新的。

你想要考虑的是你的数据数组(你下载的剪辑数组,其中可能有无限制的对象)与你的tableview数组单元格完全不相关,这将是一个相对较小的数字。

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

+0

感谢您的努力,但去了简单的版本:) – Luffen 2012-02-19 17:39:27

+1

当然。这几乎是相同的答案;无论是否将其分配给通用或自定义单元格子类,您的图像都将被释放。 – isaac 2012-02-19 18:36:23