IOS App 将图像保存在内存中

Posted

技术标签:

【中文标题】IOS App 将图像保存在内存中【英文标题】:IOS App keeps Images in Memory 【发布时间】:2017-06-16 15:18:25 【问题描述】:

我的应用有两个带有图像的视图控制器

当我启动应用程序时,内存会增加,然后当我转到另一个视图控制器并加载第二张图像(我有一个按钮来执行此操作)时,内存又会增加......这是我所期望的。 .

但是,当我通过按钮关闭第二个 VC 控制器或删除第二个 VC 中的图像,然后关闭控制器时,内存永远不会下降。

为什么会这样,带有大量图像的应用程序可能会变大.. 我如何释放第二个 VC 的内存或至少释放第二个图像的内存。

在运行应用程序时,我在 Xcode 8 的调试导航器下查看内存。

xcode project can be found here , very simple

【问题讨论】:

【参考方案1】:

ios 会缓存图片。 documentation for UIImage(named:) 说:

讨论

此方法在系统缓存中查找具有指定名称的图像对象,并返回最适合主屏幕的该图像的变体。如果匹配的图像对象尚未在缓存中,则此方法从磁盘或可用资产目录中定位并加载图像数据,然后返回结果对象。

系统可能随时清除缓存的图像数据以释放内存。仅对缓存中但当前未使用的图像进行清除...

特殊注意事项

如果您有一个只显示一次的图像文件并希望确保它不会被添加到系统的缓存中,您应该改为使用 imageWithContentsOfFile:。这将使您的一次性图像远离系统图像缓存,从而可能改善您应用的内存使用特性。

请注意,您无法控制何时释放此缓存。操作系统会按照它认为合适的方式执行此操作(通常是为了响应内存压力)。

底线,我们通常不担心UIImage 的固有缓存,只需确保应用程序没有自己的内存问题,例如确保 deinit 被调用和/或使用 Xcode 中的“调试内存图”功能来观察内存图。或者,如果您愿意,可以使用UIImage(contentsOfFile:) 以编程方式设置图像。

【讨论】:

谢谢,这很有道理.. 快速跟进问题.. 我有 x1、x2、x3 的图像文件.. 如果我使用 UIImage(contentsOfFile:),Xcode 是否仍然显示正确自动文件还是我必须使用设备检测功能,例如如果 iphone7Plus 然后 UIImage(contentsOfFile:...."@x3" contentsOfFile 不会自动抓取正确比例的图像,因此您必须自己执行此操作(尽管我会使用 UIScreenscale 而不是引用特定设备)。因此,您必须在 UIImage(named:)UIImage(contentsOfFile:) 之间进行选择,后者为您缓存并选择适当的图像资产。 @Rob "contentsOfFile 不会自动抓取正确比例的图像" 是的。这是它所做的最重要的事情之一。如果您的 app bundle 包含 pic.pngpic@2x.png,并且您有 pic.png 的路径,contentsOfFile 将在双分辨率设备上加载 pic@2x.png

以上是关于IOS App 将图像保存在内存中的主要内容,如果未能解决你的问题,请参考以下文章

从cordova html页面(cordova)加载保存在iOS App Documents目录中的图像?

ios 13.1 无法将文件保存到 App Directory

是否可以在 App 沙箱之外的 iOS 上保存录制的音频文件?

ios 13.1无法将文件保存到App Directory

iOS 检查库中是不是存在图像

在 iOS 上缩小图像最节省内存的方法是啥?