在iOS中加载GIF会消耗过多的内存

7
我一直在测试很多开源的动态gif库,以将GIF文件加载到我们的Swift项目中。
它们中的大多数声称是高性能库,但是每当我加载一个动画gif时,我的应用程序会使用约8MB的内存。
问题在于这个专用的内存空间似乎永远不会被释放。我们可以看到它呈线性增长:

enter image description here

这让我想知道我在这里是否做正确了。这种行为是正确的,还是可能对用户有害?


你是在模拟器上遇到这个问题,还是在实际设备上? - Pierce
还有,你正在使用哪些第三方库? - Pierce
@Pierce 这是来自真实设备的数据。而且看起来这是一种常见的行为,因为我已经尝试过GIFU、SwiftyGif和其他几个库了。 - Machado
1
8MB 对我来说太离谱了!这让我觉得一定有问题。我十分钟后要进行电话面试,但是面试结束后如果没有人帮助你解决问题,我会使用 SwiftGIF 去分析我使用的一个应用程序并告诉你我的内存分配情况。 - Pierce
3
Nitpick:您的图表中的内存使用并非呈指数增长,而是呈线性增长。 - NobodyNada
2
8MB 对我来说也有点多。不过看一下这个... https://github.com/kirualex/SwiftyGif#benchmark。感觉好像是“正常”的。 - Machado
1个回答

5
你需要手动删除GIF图像,才能使它们从内存中清除。
例如:在此示例中,gifViwer可以是你的GIF查看器。
self.gifViewer.removeFromSuperview()
self.gifViewer = nil

如果您需要指定一个代表,那么您也可以添加它。

self.gifViewer.Delegate = nil

注意:当视图控制器完全卸载时,您需要运行此操作,因为应用程序将开始在已删除的视图中查找gifViewer。如果您需要在不卸载视图的情况下清除gif图像,则建议使用上述步骤,然后通过编程方式将视图添加到superView。这无法与界面设计器和IBOutlets一起使用。
let gifViewer = yourGifViewerClass(frame: CGRect(x: 20, y: 20, width: self.view / 2, height: self.view / 2))
    //  setup your gifViewer

从父视图中移除就足够了。对象没有被释放(我不知道为什么需要强制释放)。 - Machado
只有在使用量非常高且调用了“didReceiveMemoryWarning”时,对象才会从内存中释放。@Machado - Mentos
谢谢@Mentos,但是这个被实例化的对象在对话框内部,该对话框会触发一个方法来从父视图中移除所有视图,然后关闭。这就是我觉得奇怪的地方。 - Machado
很好的解决方案,非常感谢。在使用Instruments进行数小时的导航后,我快要疯了,找不到问题出在哪里... // 请注意,此解决方案也适用于macOS应用程序(这是我的情况,我必须在窗口关闭之前从其superview中删除GIF视图)。 - Eric Aya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接