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 需要内存来执行另一个更新的任务或您的应用程序退出之前,情况就是如此。
当我使用 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 对象即使不再在此函数中使用也不会被释放。
找到了类似问题的两个答案 (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 需要内存来执行另一个更新的任务或您的应用程序退出之前,情况就是如此。