我有一个 UICollectionView
,在网格模式中有 4 个 cells
,没有滚动
。每个单元格都有一个 imageView
。 images
存储在 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/