在媒体繁重的 swift 应用程序中管理内存的正确方法是什么?释放它?
What is the correct way to manage memory in a media heavy swift app? Release it?
更新:
我修复了内存泄漏。我仍然很好奇,对于一个旨在拉取可能无穷无尽的图像数据流以平衡性能(用户看到图像没有下载延迟)和内存使用的应用程序,最佳实践是什么。我也很好奇是否有人可以说 1) PFFile 只是用于获取流中数据的路径,还是每个 PFFile 元素占用相当大的 space? 2) 要在查看图片后释放 space 是否将设置 image=nil 释放 space?
编辑后的原文POST:
图像繁重的应用程序(例如 facebook 或 instagram)是否有最佳实践,用户可以在其中不断循环浏览图像。我注意到使用我当前的方法内存使用量不断增加。
目前我有一个用于 "Images" 的解析服务器 class,其中实际图像是一个 PFFile。我 select * 从这个并将每一行读入一个包含 "Images" 字段的客户数据结构数组,其中 PFFile 是其中之一。然后我维护一个 "current Position" 变量,每次用户单击下一步时,我添加一个将当前位置的 PFFile 转换为 UIImage,将其设置在数组元素中,并更新图像视图(这样当他们单击返回时我不必重新处理 PFFile。在测试我的应用程序时,我很快看到内存使用量飙升至 2gb,因为遍历每个图像意味着每个 UIImage 都保留在一个数组中。我绝对认为我不能坚持每个 UIImage,因为用户可能会查看所有图像,我会 运行 内存不足。
我怀疑我需要释放以前的数据,而不是在转换数据后保留每个 UIImage。一般来说,当我允许用户滚动浏览不确定数量的图像时,如果我可以自学以负责任地管理数据,我会很感激任何建议或指导。
你可以试试@AUTORELEASEPOOL
。 Here Wei Wang 写的一篇很好的文章。
希望对您有所帮助。
如果即使在视图控制器消失后您的内存也没有减少,那么您的某处存在内存问题。也许其他东西正在用图像引用该数组并导致它不被释放?
对于您的一般问题,您需要一些方法将图像保存到缓存(在磁盘上)。保留 UIImage 对象的 ever-growing 数组将意味着您的应用程序将被终止。如果您尝试在设备上进行测试,您会发现使用 2GB 内存会导致系统终止您的应用程序。对于缓存使用库。 SDWebImage 很受欢迎。
最后,请注意系统通过 UIViewController
的 didReceiveMemoryWarning
和 UIApplicationDidReceiveMemoryWarningNotification
通知告诉您内存压力。当您收到其中一个通知时,请发布一些图像。你应该如何做到这一点很复杂,取决于你自己的代码。
更新: 我修复了内存泄漏。我仍然很好奇,对于一个旨在拉取可能无穷无尽的图像数据流以平衡性能(用户看到图像没有下载延迟)和内存使用的应用程序,最佳实践是什么。我也很好奇是否有人可以说 1) PFFile 只是用于获取流中数据的路径,还是每个 PFFile 元素占用相当大的 space? 2) 要在查看图片后释放 space 是否将设置 image=nil 释放 space?
编辑后的原文POST: 图像繁重的应用程序(例如 facebook 或 instagram)是否有最佳实践,用户可以在其中不断循环浏览图像。我注意到使用我当前的方法内存使用量不断增加。
目前我有一个用于 "Images" 的解析服务器 class,其中实际图像是一个 PFFile。我 select * 从这个并将每一行读入一个包含 "Images" 字段的客户数据结构数组,其中 PFFile 是其中之一。然后我维护一个 "current Position" 变量,每次用户单击下一步时,我添加一个将当前位置的 PFFile 转换为 UIImage,将其设置在数组元素中,并更新图像视图(这样当他们单击返回时我不必重新处理 PFFile。在测试我的应用程序时,我很快看到内存使用量飙升至 2gb,因为遍历每个图像意味着每个 UIImage 都保留在一个数组中。我绝对认为我不能坚持每个 UIImage,因为用户可能会查看所有图像,我会 运行 内存不足。
我怀疑我需要释放以前的数据,而不是在转换数据后保留每个 UIImage。一般来说,当我允许用户滚动浏览不确定数量的图像时,如果我可以自学以负责任地管理数据,我会很感激任何建议或指导。
你可以试试@AUTORELEASEPOOL
。 Here Wei Wang 写的一篇很好的文章。
希望对您有所帮助。
如果即使在视图控制器消失后您的内存也没有减少,那么您的某处存在内存问题。也许其他东西正在用图像引用该数组并导致它不被释放?
对于您的一般问题,您需要一些方法将图像保存到缓存(在磁盘上)。保留 UIImage 对象的 ever-growing 数组将意味着您的应用程序将被终止。如果您尝试在设备上进行测试,您会发现使用 2GB 内存会导致系统终止您的应用程序。对于缓存使用库。 SDWebImage 很受欢迎。
最后,请注意系统通过 UIViewController
的 didReceiveMemoryWarning
和 UIApplicationDidReceiveMemoryWarningNotification
通知告诉您内存压力。当您收到其中一个通知时,请发布一些图像。你应该如何做到这一点很复杂,取决于你自己的代码。