【问题标题】:Loading GIFs in iOS consumes too much memory在 iOS 中加载 GIF 会消耗太多内存
【发布时间】:2017-02-06 18:36:26
【问题描述】:

我一直在测试很多开源动画 gif 库以将 GIF 文件加载到我们的 Swift 项目中。

它们中的大多数都声称是高性能库,但是,每当我加载动画 gif 时,我的应用程序都会使用大约 8MB 的内存。

问题是这个专用内存空间似乎永远不会被释放。我们可以看到它呈线性增长:

这让我怀疑我在这里做的是否正确。这种行为是正确的,还是可能对用户不利?

【问题讨论】:

  • 您是在模拟器上还是在实际设备上遇到这种情况?
  • 另外,您使用的是哪些第三方库?
  • 8MB 对我来说似乎太离谱了!这让我觉得一定有什么问题。十分钟后我在这里有一个电话面试,但是当面试结束时,如果没有人帮助你解决你的问题,我会去分析一个我用 SwiftGIF 使用的应用程序,并告诉你我在内存分配方面得到了什么
  • Nitpick:图表中的内存使用量没有增长exponentially,而是linearly。
  • 8MB 对我来说似乎也很多。但是看看这个.. github.com/kirualex/SwiftyGif#benchmark 。感觉很“正常”。

标签: ios swift memory animated-gif


【解决方案1】:

您需要手动删除 Gif 图像才能将它们从内存中清除。

示例: gifViwer 在此示例中可以作为您的 Gif 查看器

self.gifViewer.removeFromSuperview()
self.gifViewer = nil

如果你必须分配一个委托,那么你也可以添加

self.gifViewer.Delegate = nil

注意:您需要在 viewControler 被完全卸载时运行此程序,因为应用程序将开始在视图中寻找 gifViewer,而它已被删除。如果您需要在不卸载视图的情况下从内存中清除 gif 图像,那么我建议使用上述步骤,然后以编程方式将视图添加到 superView。这不适用于界面设计器和 IBOutlets

let gifViewer = yourGifViewerClass(frame: CGRect(x: 20, y: 20, width: self.view / 2, height: self.view / 2))
    //  setup your gifViewer

【讨论】:

  • 从 superView 中移除就足够了。对象没有从内存中释放(我不知道为什么需要强制)。
  • 只有在使用率真的很高并且didReceiveMemoryWarning被称为@Machado时,对象才会从内存中释放
  • 谢谢@Mentos,但这是在 Dialog 中实例化的,该 Dialog 触发了在关闭之前从 superView 中删除所有视图的方法。这就是为什么我觉得它很奇怪。
  • 很好的解决方案,非常感谢。在 Instruments 中导航数小时后,我快要发疯了,但找不到问题所在... // 请注意,此解决方案也适用于 macOS 应用程序(我的情况是,我必须在窗口关闭)。
猜你喜欢
  • 1970-01-01
  • 2020-04-16
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
  • 2019-01-16
相关资源
最近更新 更多