我遇到这样一个情况:在使用 async/await
循环创建许多 Cocoa 对象时,由于对象仅在循环结束时释放(而不是每次迭代),因此内存峰值会快速上升。
解决方法是使用 autoreleasepool
。但是,我似乎无法将 autoreleasepool
与 async/await
结合使用。
下面是一个示例:
func getImage() async -> NSImage? {
return NSImage(named: "imagename") // Do some work
}
Task {
// This leaks
for _ in 0 ..< 1000000 {
let image = await getImage()
print(image!.backgroundColor)
}
}
内存峰值一直飙升到220MB,对于我来说有点太多了。
通常,您可以将内部循环包装在autoreleasepool
中,并解决问题,但是当我尝试使用async
函数时,会出现以下错误:
Cannot pass function of type '() async -> ()' to parameter expecting synchronous function type
有没有什么解决方法?或者是否有另一种方法来实现在循环内释放Cocoa对象的同样目标?
async
方法中,autoreleasepool
编译并正常工作。 - matt