swift - iOS - 集合视图是否将每个单元格保留在内存中?
问题描述
我有一个带有 6 种不同类型单元格的垂直集合视图...我观察到,当我滚动时,正在从服务器获取新帖子,(我正在使用分页机制(我正在获取 20 x 20) ) 应用程序因日志而崩溃Message from debugger: Terminated due to memory issue
我还注意到,当分配的 RAM 超过 1 GB 时会发生这种情况,这太疯狂了,因为在任何给定时间都会出现大约三个帖子......当获取 400 多个帖子时就会发生这种情况!
我想当一个单元格不在视野范围内时,集合视图会释放它。那正确吗?因此,如果一个单元格有一个图像,我在它即将呈现时下载/缓存它,然后该单元格不再可见,因为我滚动了,那么该图像不应该在内存中。正确的?
编辑1:
我在代码中所做的是检查willDisplay cell
即将显示的单元格是否是最后一个。如果是,那么我正在向服务器发出请求,将接下来的 20 个帖子带给我(如果有的话)。当它发生时,我将新帖子附加到帖子数组中。之后,我只是重新加载集合视图。
编辑2:
我使用PFImageView
fromParse SDK
作为缓存机制
解决方案
不,它们被重复使用。
图像可能在缓存中,这可能是导致您使用大量内存的原因。必要时应将它们从内存中删除,如果您想从头开始实现此功能,可以在NSCache
.
我建议使用SDWebImage或Kingfisher来有效地下载和缓存图像。
集合视图采用视图回收程序来提高效率。当视图移出屏幕时,它们会从视图中移除并放置在重用队列中,而不是被删除。随着新内容在屏幕上滚动,视图会从队列中移除并重新使用新内容。
推荐阅读
- mapbox-gl-js - 修复“找不到变量:mapboxgl”问题
- r - 计算 R 中种族的百分比
- javascript - Nodejs setImmediate() 函数实时用例和示例
- azure-blob-storage - 使用 Azure 存储容器元数据作为搜索筛选器
- javascript - 如何使用嵌套列表中的列表项找到最深的 ul/ol
- .net-core - 如何在不访问 nuget.org 的情况下构建/部署独立的 .netcore 应用程序
- android - 安卓相机X。拍摄开始后如何更改相机参数?
- mysql - #1136 - 列计数与第 1 行的值计数不匹配错误
- r - 是否可以 dplyr::lag 上一年而不是上一行?
- python-3.x - 如何按 Pandas 的特定给定值分组?