为什么在Swift5中,UIImage.jpegData调用将保留那么多内存?

问题描述

我有一个运行以下代码段的应用程序-

...
let newImage = generateImage()
let imageData = newImage.jpegData(compressionQuality: 1)

// operations with the imageData. The memory consumption of the
// imageData object looks reasonable,2-3 MB for a 4800*6000
// pixel image.
...

func generateImage() -> UIImage {
    let canvasSize = self.outputImage.size
    UIGraphicsBeginImageContext(canvasSize)
    self.imageView.zoomView?.layer.render(in: UIGraphicsGetCurrentContext()!)
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return newImage!
}

观察到,在以下代码的步骤中,我将看到内存峰值

let imageData = outputImage.jpegData(compressionQuality: 1)

并且,直到释放整个视图,此内存峰值才会消失。我确实按照此处swift UIGraphicsGetImageFromCurrentImageContext can't release memory的建议尝试了一些autoreleasepool()或其他放置在DispatchQueue()中的操作,但是显然它们不起作用。

为了减少混乱,generateImage()调用不会产生内存泄漏,而只会产生峰值,即,在generateImage()调用之后,内存会立即下降,但我只是将其放在那里查看是否相关(我尝试过一些带有jpegData()的UIImage,但是我无法100%重现此问题)。

我毫不犹豫地将其称为内存泄漏,因为我相信这个对象(我实际上不知道为什么UIImage.jpegData()调用也消耗了那么多内存,看起来像Swift内存管理算法的错误)最终在视图已卸载。但是有什么方法可以避免由于jpegData转换而导致的大量内存消耗或释放内存?

(当在具有4800 * 6000Pixels的iPhone上加载24MB图像时,通过UIImage.jpegData()操作,内存将增加约100MB)。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)