CIImage 在 Swift 中未从内存中释放

CIImage not getting freed from memory in Swift

当我使用 CoreImage 的 CIImage 在 macOS Mojave 上使用 Xcode 10-latest 的 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 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 内存管理基础知识的基本知识,或者这实际上是一个我必须以某种方式解决的错误?

如有任何帮助,我们将不胜感激。

这个问题的解决方案相当简单:没有内存泄漏,而且 CIImage 的保留时间没有超过应有的时间。

macOS "Activity Monitor" 以及 Xcode 的资源使用基本视图显示了 macOS 认为进程需要并因此分配给它的内存量。

当您 运行 一个内存密集型应用程序时,它会保留该分配,而不会实际使用任何内存,即使在内存密集型任务已经完成并且对象已从 RAM 中删除后也是如此。

加载那么多 CIImage 导致 macOS 为我的应用程序分配大量内存,以适应其储备密集型任务。由于它无法预测/识别该任务何时完成,因此该应用程序保留了该内存分配,但没有实际使用它。在 macOS 需要内存来执行另一个更新的任务或您的应用程序退出之前,情况就是如此。