在Swift中CIImage无法从内存中释放

时间:2019-08-12 01:32:52

标签: swift macos memory ciimage

当使用CoreImage的CIImage使用Xcode 10最新版本在macOS Mojave上的Swift 4项目中加载多个图像时,我遇到了问题。

我使用的代码与此类似:

@IBAction func loadImages(sender: Any?) {
        let panel = NSOpenPanel()
        panel.allowsMultipleSelection = true
        panel.allowedFileTypes = [kUTTypeImage as String]
        let result = panel.runModal()

        if (result.rawValue == NSFileHandlingPanelOKButton) {
            for url in panel.urls {
                let image = CIImage(contentsOf: url)
                print(image!.extent.width)
            }
        }
    }

如果我使用此代码并加载大量较大的高质量图像,则即使该功能运行了很长时间(无明显原因),我的应用也会消耗数百MB的RAM。似乎CIImage对象只是在它们不再在此函数中使用后才被释放。

找到了类似问题(answer 1answer 2的两个答案,我以为将处理CIImages的代码包装在autoreleasepool{} Clojure中将解决我的问题,但是当我的代码看起来像这样时,问题仍然存在:

@IBAction func loadImages(sender: Any?) {
        autoreleasepool {
            let panel = NSOpenPanel()
            panel.allowsMultipleSelection = true
            panel.allowedFileTypes = [kUTTypeImage as String]
            let result = panel.runModal()

            if (result.rawValue == NSFileHandlingPanelOKButton) {
                for url in panel.urls {
                    let image = CIImage(contentsOf: url)
                    print(image!.extent.width)
                }
            }
        }
    }

我是否只是在这里缺少一些Swift内存管理基础知识,或者这实际上是我必须以某种方式解决的错误?

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

这个问题的解决方案非常简单:没有内存泄漏,并且CIImage的保留时间没有达到预期的时间。

macOS“活动监视器”以及Xcode的资源使用情况基本视图显示了macOS认为一个进程将需要并因此分配给它的内存量。

运行内存密集型应用程序时,即使完成了内存密集型任务并将对象从RAM中删除后,它仍将保留该分配,而不会实际使用任何内存。

加载许多CIImage会导致macOS为我的应用分配大量内存,以适应其占用大量服务器资源的任务。由于无法预测/识别何时完成任务,因此该应用程序会保留该内存分配,而不会实际使用。在macOS需要内存来执行其他更多当前任务或您的应用退出之前,情况就是这样。