2

我有一种情况,我正在使用 循环创建许多 Cocoa 对象async/await,并且内存尖峰,因为这些对象仅在循环结束时才被释放(而不是每次迭代)。

解决方案是使用autoreleasepool. 但是,我似乎无法autoreleasepoolasync/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 对象的相同目标?

4

1 回答 1

2

@CouchDeveloper 提到要包装getImagea Task,因为它有自己的autoreleasepool,而且它似乎工作!

只是改变

func getImage() async -> NSImage? {
    return NSImage(named: "imagename") // Do some work
}

func getImage() async -> NSImage? {
    await Task {
        return NSImage(named: "imagename") // Do some work
    }.value
}
于 2021-08-29T20:38:03.810 回答