代码之家  ›  专栏  ›  技术社区  ›  K.Wu

在swift中渲染gif图像会导致大量内存使用?

  •  -1
  • K.Wu  · 技术社区  · 7 年前

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

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

    在哪里? .gif UIImage 我是从 here ,我相信很多人都用它。

    问题是,当我运行上述代码时,内存使用量增加了大约20+MB,这并不过分,但是,当我删除这个选定的gif资产时,内存使用量不会下降。如果我继续选择更多的gif资源,对于我选择并运行上述代码的每一个资源,内存使用量将增加20+mb。现在这已经不可接受了,因为内存使用率只会上升,在应用程序崩溃之前不会下降。

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

    ——————————————————————————————————更新

    下面是我的问题的一个小演示:

    enter image description here

    1. 这个 UIImageView 在“测试屏幕”上显示所选gif图像的缩略图

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

    3. 正如你所看到的,当我在全屏上反复打开GIF图像时,内存上升,不会下降。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Manuel    7 年前

    内存泄漏可能在您自己的代码中,而不是在 .gif 延伸。可能是显示 GIF 当你关上它的时候,它不会失去知觉。无论泄漏在哪里,有两种方法可以找到:

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

    class MyClass {
    
       init() { 
          print("init: \(self)")
       }
    
       deinit { 
          print("deinit: \(self)")
       }
    }
    

    b) 一个更具洞察力和方便的方法是 xcode仪器 .

    它是检查应用程序内存管理的更强大的方法,而不是添加 打印 命令。此外,一旦你知道如何使用它,你会喜欢它,因为它自动化了许多步骤,最终你将能够检查内存泄漏,只需点击几下。

    在这里你可以找到一个 tutorial 关于如何使用xcode仪器。

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