收到内存警告时 UICollectionView 维护的单元队列会发生啥?

Posted

技术标签:

【中文标题】收到内存警告时 UICollectionView 维护的单元队列会发生啥?【英文标题】:What happens to the UICollectionView maintained cell queue on receiving memory warning?收到内存警告时 UICollectionView 维护的单元队列会发生什么? 【发布时间】:2017-04-11 11:03:00 【问题描述】:

当 UICollectionViewCell 对象不可见时,它们会被添加到队列中以供重用。如果发生内存警告,可重用队列中的单元会发生什么情况。队列是否已清空,单元格是否已被销毁,还是保持原样?

【问题讨论】:

你为什么要关心?如果它被破坏了,你无论如何都应该创建一个新的,所以它不应该真的打扰你 @Lefteris 可以说我有不同的单元格,内容繁重,占用大量内存。如果我知道在出现内存警告时会发生什么情况,那将是一个额外的优势。很高兴知道我是否可以依赖系统或需要清除该内存。 然后把重的内容放到自动释放池中 嘿,这里的队列是什么意思?..调度队列还是其他? @PhaniRaghu 它是 UICollectionView 实例的可重用队列 【参考方案1】:

如果您对您的单元格保持强引用,那么它们将不会被删除,并且您将拥有这些单元格的音调。您还必须记住,如果您的单元格没有正确出列并且您对该单元格有强引用,那么您的 tableViewController 也不会重新初始化。

【讨论】:

在我的案例中,我没有对单元格进行强引用。我只想知道在内存警告的情况下队列会发生什么,因为它的实现是隐藏的。 没有人想要保持对单元格的引用,但有时会发生这种情况,导致您的滚动速度开始变得不稳定,直到您的应用程序内存不足并且系统将杀死您的应用程序【参考方案2】:

在收到内存警告时,不可见的单元格对象将从内存中清除,同时出队管理器在内部处理此过程。

要了解更多,内存管理是如何工作的?在模拟器中运行您的代码。

打印单元格对象,它提供了它获得的地址。稍后在菜单中选择Hardware选项以生成内存警告。

"row = 7 ->  cell = <UICollectionViewCell: 0x7ff8b89096e0; frame = (2 1935; 371 265); clipsToBounds = YES; hidden = YES; opaque = NO; layer = <CALayer: 0x61800003da20>>"

这也将帮助您更多地了解地址管理。

【讨论】:

以上是关于收到内存警告时 UICollectionView 维护的单元队列会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 UICollectionView iOS 7 中收到内存警告

使用 UICollectionView 收到内存警告以查看图像

UICollectionView 中的内存警告(带图像)

从 iphone 相机拍照时收到 iphone 中的内存警告问题

从相机点击多张图像时收到内存警告

合并两个 UIImage 时收到内存警告