我有一种情况,我正在使用 循环创建许多 Cocoa 对象async/await
,并且内存尖峰,因为这些对象仅在循环结束时才被释放(而不是每次迭代)。
解决方案是使用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,这对我来说有点太多了。
通常,您可以将内部循环包装在 aautoreleasepool
中,这样可以解决问题,但是当我使用async
函数尝试时,会出现以下错误:
Cannot pass function of type '() async -> ()' to parameter expecting synchronous function type
有没有办法解决?或者是否有另一种方法可以实现在循环内释放 Cocoa 对象的相同目标?