我有一个滚动视图,我可能会添加 400 个缩略图。我在仪器中对其进行了分析,并观察内存 livebytes 高达约 70MB。然后我从超级视图中删除所有这些,并且活动字节保持不变。
需要恢复这个内存。有什么诀窍?
谢谢。
我有一个滚动视图,我可能会添加 400 个缩略图。我在仪器中对其进行了分析,并观察内存 livebytes 高达约 70MB。然后我从超级视图中删除所有这些,并且活动字节保持不变。
需要恢复这个内存。有什么诀窍?
谢谢。
我认为这是一个类似的问题: Problem dealloc'ing memory used by UIImageViews with rather large image in an UIScrollView
我以前也遇到过类似的问题。一种解决方案似乎是在最终发布之前将 UIImageView 图像设置为 nil,根据这个问题的答案: 在 iPhone 上混淆内存分配错误
确保您还从数据源中删除了 UIImage 实例。另外,考虑将 UIImage 放在 NSCache 中,当内存不足时清除它们,并使用 UITableView 而不是 UIScrollView(以重用界面元素)。
有两件事需要管理 - 视图和图像。您只需要足够的滚动视图子视图来填充滚动视图的可见部分。这里的好模式是有一个重用池。当您需要滚动视图的子视图时,请在重用池中检查一个。如果没有,分配一个。当滚动发生时,将不再可见的视图放入重用池中,并在新可见的空间中添加视图(首先检查重用池)。
图像可以放置在由它们的 url 和时间索引的缓存中。可变字典非常适合 url 索引。包含 url 的可变数组可以是时间索引的一个很好的 FIFO 队列。该 url 可以是应用程序中打包图像的文件 url,也可以是下载图像时的远程 url。要添加到缓存中,请将 url-image 对添加到字典中,并将 url 添加到时间数组的前面(索引 0)。
每次添加到缓存时,请检查它的大小是否超出您的目标。如果它确实删除了最旧的图像。为此,请从数组中获取 lastObject,从字典中删除该 url 键值对并从数组中删除LastObject。
此图像缓存可以/应该大于滚动视图中可见视图的数量。您可以调整此大小以匹配所需的内存目标,同时考虑获取图像所需的时间(如果图像是远程的,您可能需要更大的缓存)。
将图像子视图添加到滚动视图时,为其分配默认图像。使用 url 查找检查缓存中的缓存图像。如果那里有一个,请替换默认值。如果没有,请为该图像启动异步获取。当该图像到达时,将其添加到缓存中并检查滚动视图以查看包含该图像的子视图是否仍然可见(它可能已被滚动)。如果是,请设置图像。