缓存溢出的图像处理

Image processing with overflowing cache

已解决

我必须处理 100 张 2400x2000 像素的图像。我在后台线程中循环执行。但是在第 60 - 70 张图像上,渲染结果是黑色或白色图像......以及要记录的消息:

"Application(2227,0x16c0db000) malloc: 无法分配区域 *** mach_vm_map(size=15777792) 失败(错误代码=3)

这是我在循环中所做的

        UIGraphicsBeginImageContextWithOptions(PageSize.PX.size, true, 1)

        let context = UIGraphicsGetCurrentContext()

        UIColor.white.setFill()

        context?.fill(CGRect(x: 0, y: 0, width: PageSize.PX.size.width, height: PageSize.PX.size.height))

        image?.draw(in: newImageRect)

        let newImage = UIGraphicsGetImageFromCurrentImageContext()

        UIGraphicsEndImageContext()

如果我同时处理 50 张图像 - 一切正常。 每个循环也被添加到自动释放池中。

我已经尝试过 UIGraphicsImageRenderer。它的工作速度比通过图像上下文慢,并且在第 50 - 60 张图像之后它们的大小为 0x0 像素....

我该如何解决这个问题?我能以某种方式清理图像缓存吗?或者我可以增加图像处理缓存?或者...???

花费 5 天 2-3 小时进行调试。如果您遇到这样的问题,我希望这篇 post 能对您有所帮助。

这是非常奇怪的情况,这个错误只出现在 beta iOS 12 中。在 iOS 11 中一切正常。

怎么回事?在我的应用程序中,我需要从图库中重绘 100 张图像,当我调用 UIImageJPEGRepresentation 与 UIGraphicsBeginImageContextWithOptions 配对时,我认为某些图像处理器缓存溢出(在第 50-60 张图像上 - 结果为 0x0 大小或黑色图像。这取决于我使用的技术) .另请注意,我在每个循环中添加了 autorelesePool {},并且在处理图像时我的内存消耗不超过 200 Mb...我还尝试使用仪器进行调试,但没有发现任何泄漏等。

我想通了 运行 每个图像操作链异步,延迟 0.1 秒。我认为这不是一个好方法,但在 100 张图像上,它的处理时间从 25 秒增加到 35 秒。而且效果很好。

我希望在稳定的 iOS12 中它不会发生。

祝大家编码愉快。