在媒体快速应用程序中管理内存的正确方法是什么?释放它吗?

时间:2019-05-08 08:17:01

标签: swift memory memory-management parse-platform uiimageview

更新: 我修复了内存泄漏。我仍然很想知道应用程序的最佳实践是什么,该应用程序旨在拉下可能无休止的图像数据流以平衡性能(用户看到图像而没有下载延迟)和内存使用情况。我也很好奇,是否有人可以说1)PFFile只是用于获取流中数据的路径还是每个PFFile元素占用了大量空间? 2)要在查看图像后释放空间,将图像设置为nil释放空间吗?

编辑后的原始帖子: 是否有图像密集型应用程序的最佳实践(例如,facebook或instagram),用户可以不断循环浏览图像。我注意到,使用当前的方法,内存使用量会不断增加。

当前,我有一个用于“图像”的解析服务器类,其中实际图像是PFFile。我从中选择*,并将每一行读入包含PFFile之一的“ Images”字段的客户数据结构数组。然后,我维护一个“当前位置”变量,每次用户单击时,我添加一个将当前位置的PFFile转换为UIImage,在数组元素中进行设置,并更新图像视图(这样,当他们单击时,我不会不必重新处理PFFile。在测试我的应用程序时,我很快就看到内存使用量飙升至2gb,因为遍历每个图像意味着每个UIImage都保留在一个数组中。我绝对认为我不能坚持使用每个UIImage,因为用户可能会查看所有图像,而我的内存将用完。

我怀疑在转换数据后我不需要释放每个UIImage,而是需要释放先前的UIImage。通常,当我允许用户滚动显示数量不确定的图像时,我会提供一些可以自己负责任地管理数据的建议或指导。

2 个答案:

答案 0 :(得分:1)

您可以尝试玩@AUTORELEASEPOOLHere是王伟撰写的一篇不错的文章。

希望有帮助。

答案 1 :(得分:1)

如果即使视图控制器消失后内存仍没有减少,则说明您的内存存在问题。也许其他东西正在引用带有图像的数组,并导致它不被释放?

对于您的一般问题,您需要某种方式将图像保存到缓存(在磁盘上)。保持不断增长的UIImage对象数组将意味着您的应用程序将被终止。如果您尝试在设备上进行测试,则会发现2GB的内存正在使用将导致系统终止您的应用程序。对于缓存,请使用库。 SDWebImage非常受欢迎。

最后,注意系统通过UIViewController的{​​{1}}和didReceiveMemoryWarning通知您有关内存压力的信息。当您收到这些通知之一时,请释放其中一些图像。如何执行此操作很复杂,并且取决于您自己的代码。