当使用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 1和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内存管理基础知识,或者这实际上是我必须以某种方式解决的错误?
任何帮助将不胜感激。
答案 0 :(得分:0)
这个问题的解决方案非常简单:没有内存泄漏,并且CIImage的保留时间没有达到预期的时间。
macOS“活动监视器”以及Xcode的资源使用情况基本视图显示了macOS认为一个进程将需要并因此分配给它的内存量。
运行内存密集型应用程序时,即使完成了内存密集型任务并将对象从RAM中删除后,它仍将保留该分配,而不会实际使用任何内存。
加载许多CIImage会导致macOS为我的应用分配大量内存,以适应其占用大量服务器资源的任务。由于无法预测/识别何时完成任务,因此该应用程序会保留该内存分配,而不会实际使用。在macOS需要内存来执行其他更多当前任务或您的应用退出之前,情况就是这样。