Ios 在Swift中渲染GIF图像会导致大量内存使用?
当我尝试渲染从photo library(其数据类型为Phaset)中选择的GIF图像时,我使用以下代码:Ios 在Swift中渲染GIF图像会导致大量内存使用?,ios,swift,Ios,Swift,当我尝试渲染从photo library(其数据类型为Phaset)中选择的GIF图像时,我使用以下代码: PHImageManager().requestImageData(for: asset, options: nil) { (data, _, _, _) in if let imageData = data { imageView.image = UIImage.gif(data: imageData) } } gif是我复制的UIImage的扩展,我相
PHImageManager().requestImageData(for: asset, options: nil) { (data, _, _, _) in
if let imageData = data {
imageView.image = UIImage.gif(data: imageData)
}
}
gif是我复制的UIImage的扩展,我相信很多人都使用它
问题是,当我运行上述代码时,内存使用量增加了约20+MB,这并不过分,但是,当我删除此选定的GIF资源时,内存使用量并没有下降。如果我继续选择更多的GIF资源,每选择一个并运行上面的代码,内存使用就会增加20+MB。现在它不再是可接受的了,因为在应用程序崩溃之前,内存使用量只会上升而不会下降
我理解为什么渲染GIF图像时内存使用率会上升,我的意思是,图像数据位于内存中。我不知道的是,当我想删除GIF图像时,如何释放内存块
-------更新---------
下面是我的问题的一个小演示:
测试屏幕上的UIImageView显示所选GIF图像的缩略图
当我按下GIF图像时,应用程序将以全屏模式打开图像,如果它是GIF图像,它将通过运行上述代码来播放动画图像
正如你所看到的,当我在全屏上反复打开GIF图像时,内存会上升,而不会下降
内存泄漏可能在您自己的代码中,而不是在.gif扩展名中。当您关闭显示.gif的视图控制器时,该视图控制器可能没有取消初始化。无论泄漏在哪里,都有两种方法可以找到: 一种非常简单的方法是向对象的取消/初始化添加一个print命令。因此,您可以在控制台中看到何时应取消初始化对象并释放内存,但实际上没有,例如:
class MyClass {
init() {
print("init: \(self)")
}
deinit {
print("deinit: \(self)")
}
}
一个更具洞察力和方便的方法是使用Xcode仪器
这是一种比添加打印命令更强大的检查应用程序内存管理的方法。此外,一旦你知道如何使用它,你会喜欢它,因为它自动化了很多步骤,最终你只需点击几下就可以检查内存泄漏
在这里你可以找到一个关于如何使用Xcode仪器的指南
如果您在打开并显示GIF的黑色背景屏幕上发布代码,可能会提示问题所在。在大多数情况下,它类似于一个没有被宣布为弱的代表或其他形式的问题。有人投票结束了这个问题,因为它太宽了,怎么会太宽?有了你的演示,你的问题很好,不用担心。很清楚你在问什么。见下面我的答案。