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

Sha*_*ane 5 memory-leaks uiimage ios uicollectionview swift

我有一个UICollectionView带有 4cells的网格图案,没有scrolling. 每个单元格都有一个imageView. 该images被存储在资源文件夹,并通过名称检索参考(见下文)。经过一些UI行动,这个想法是

collectionView.reloadData() 
Run Code Online (Sandbox Code Playgroud)

并替换image每个cell.

一切正常,但climbing每次重新加载后内存使用量保持不变。我曾假设reloadData()转储unnecessary data,但这次经历让我感到困惑。发生了什么?

如果有帮助,我会在某处阅读加载图像

UIImage(name: ...) 
Run Code Online (Sandbox Code Playgroud)

缓存图像。我试图确认这一点,但画了一个空白。

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

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

And*_*rea 5

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

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

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