渲染GIF图像会导致Swift中大量内存使用?

时间:2018-06-10 21:20:19

标签: ios swift

当我尝试渲染GIF图像(从照片库中选择,其数据类型为PHAsset)时,我使用以下代码:

PHImageManager().requestImageData(for: asset, options: nil) { (data, _, _, _) in
    if let imageData = data {
        imageView.image = UIImage.gif(data: imageData)
    }
}

.gif是我从here复制的UIImage的扩展名,我相信很多人都会使用它。

问题是,当我运行上面的代码时,内存使用量增加了大约20 + MB,这并不是很离谱,但是,当我删除这个选定的GIF资产时,内存使用量不会下降。如果我继续选择更多的GIF资产,我选择并运行上面的代码,内存使用量将增加20 + MB。现在它已经不能接受了,因为内存使用率会上升,直到应用程序崩溃才会丢失。

我理解为什么在渲染GIF图像时内存使用量会增加,我的意思是,图像数据位于内存中。我不知道的是,当我想删除GIF图像时,如何释放大块内存?

-------------- UPDATE -----------------

这是我的问题的一个小演示:

enter image description here

  1. UIImageView on" TestScreen"显示所选GIF图像的缩略图

  2. 当我按下GIF图像时,应用程序将以全屏模式打开图像,如果是GIF图像,它将通过运行以上代码播放动画图像

  3. 正如您所看到的,当我全屏重复打开GIF图像时,内存会上升并且永不下降

1 个答案:

答案 0 :(得分:2)

内存泄漏可能在您自己的代码中,而不是在.gif扩展名中。当关闭它时,显示.gif的视图控制器可能没有deinitiazile。无论泄漏在哪里,都有两种方法可以找到它:

a)一种非常简单的方法是在对象的de / /初始化中添加print命令。所以你可以在控制台中看到一个对象应该被取消初始化并释放内存,但实际上并没有,例如:

class MyClass {

   init() { 
      print("init: \(self)")
   }

   deinit { 
      print("deinit: \(self)")
   }
}

b)更有见地和方便的方法是使用 Xcode Instruments

检查应用程序的内存管理比使用print命令更强大。此外,一旦你弄清楚如何使用它,你会喜欢它,因为它自动化了很多步骤,最终你只需点击几下就可以检查内存泄漏。

在这里你可以找到关于如何使用Xcode Instruments的tutorial

如果您使用打开的黑色背景发布屏幕代码并显示GIF,则可能会提示问题可能是什么。在大多数情况下,它类似于未声明为weak的委托或circular strong reference的其他形式。