Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Swift中渲染GIF图像会导致大量内存使用?_Ios_Swift - Fatal编程技术网

Ios 在Swift中渲染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的扩展,我相

当我尝试渲染从photo library(其数据类型为Phaset)中选择的GIF图像时,我使用以下代码:

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的黑色背景屏幕上发布代码,可能会提示问题所在。在大多数情况下,它类似于一个没有被宣布为弱的代表或其他形式的问题。

有人投票结束了这个问题,因为它太宽了,怎么会太宽?有了你的演示,你的问题很好,不用担心。很清楚你在问什么。见下面我的答案。