【发布时间】:2020-09-06 14:29:15
【问题描述】:
我有一个应用程序运行以下代码 sn-ps --
...
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)
并且这个内存峰值不会消失,直到整个视图被释放。我确实尝试了一些 autoreleasepool() 或其他放入 DispatchQueue() 的操作,如swift UIGraphicsGetImageFromCurrentImageContext can't release memory 中所建议的那样,但显然它们不起作用。
为了减少混淆, generateImage() 调用不会产生内存泄漏,只会产生峰值,即内存在 generateImage() 调用后立即下降,但我只是将它放在那里看看是否相关(我试过其他一些带有 jpegData() 的 UIImage 但我无法 100% 重现此问题。
我不愿将其称为内存泄漏,因为我相信这个对象(我实际上不知道为什么 UIImage.jpegData() 调用也会消耗那么多内存,看起来像 Swift 内存管理算法的错误)最终被回收时视图已卸载。但是有什么办法可以避免jpegData转换造成的巨大内存消耗或者释放内存呢?
(在我的 iPhone 上以 4800*6000Pixels 加载 24MB 图像时,使用此 UIImage.jpegData() 操作,内存将增加约 100MB)。
【问题讨论】:
-
您能否澄清一下您的代码 sn-p 与您的“视图”有何关系。上面的代码是 UIView 的子类吗?
-
不显示“sn-ps”。在上下文中向我们展示实际的代码。我们不知道您的代码是如何运行的,也不知道图像来自何处、数据去向。