ios - swift - UICollectionView 或 UIImage - 如何防止图像缓存

标签 ios swift memory-leaks uiimage uicollectionview

我有一个 UICollectionView,在网格模式中有 4 个 cells,没有滚动。每个单元格都有一个 imageViewimages 存储在 Assets 文件夹中,并通过名称引用检索(见下文)。经过一些 UI 操作后,想法是

collectionView.reloadData() 

并替换每个 cell 中的 image

一切正常,但内存使用在每次重新加载后一直攀升。我曾假设 reloadData() 会转储不必要的 data,但这种经历让我感到困惑。发生了什么?

如果有帮助,我在某处读到用

加载图像
UIImage(name: ...) 

缓存图像。我试图确认这一点,但还是一片空白。

我的代码非常简单,所以我想知道这是否是一些用于滚动目的的内存错误/功能(我不想要)。

再一次,我希望停止存储内存。有什么想法吗?

最佳答案

我从来没有机会了解图像缓存何时被逐出。
Collection View 单元格出列并重用。这意味着在单元格离开屏幕后立即放入回收站,如果再次需要该单元格,则从该回收站中取出并放入您的 View 层次结构(我猜这称为享元模式),基本上您正在保存实例化成本。
因此,当您处理图像并且您的图像没有存储在内存中的其他地方,而是存储在 ImageView 中时,每次显示一个单元格并将新图像传递给 ImageView 时,旧图像应该被释放。
如果您将对旧图像的引用存储在其他地方,例如缓存或数组,则不会发生这种情况。
要从 xcasset 加载图像,您只能使用 UIImage(name: ...) 这意味着图像将被缓存。即使 Apple 表示此缓存将在内存压力情况下被逐出并且从未“及时”看到这种情况发生以避免应用程序崩溃。
你可以做的是不要保存在 xcasset 文件夹中,而是保存在你项目的任何地方,这样它们就会被加载到你的主包中,你可以从这里使用 common 加载图像:

let path = NSBundle.mainBundle().pathForResource(<#T##name: String?##String?#>, ofType: <#T##String?#>)
    let image = UIImage(contentsOfFile: path!)

注意路径是可选的。
作为一般规则,始终尝试通过使用相同 View 大小(以像素为单位)的图像来节省资源,图像占用的空间没有任何意义,只是它的压缩方式,当加载到内存中时它需要 n_pixel_height * n_pixel_width * n_channels 字节

关于ios - swift - UICollectionView 或 UIImage - 如何防止图像缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38145102/

相关文章:

ios - Swift 中来自 nib 的自定义 UITableViewCell

ios - 错误错误 : Attempted to assign to readonly property. ChildScope

objective-c - 具有 Objective-C 选择器 'setTag' 的方法 'setTag:' 与具有相同 Objective-C 选择器的父类(super class) 'tag' 的 'UIView' 的 setter 冲突

c++ - 为什么必须为存储在堆中的函数的局部变量调用 delete?

iphone - 应用程序是否有可能并且有必要实现零内存泄漏?

iphone - 苹果会拒绝带有多个警告的 iOS 应用吗?

javascript - iOS 7 safari 可能的 javascript/dojo trim 错误

interface-builder - 无法在 Xcode 6 中测试实时渲染

ios - 如何使位置自动完成文本框 Swift ios 8

ios - 显示 pdf 图像时 Core Graphics 内存泄漏