2

を使用してループ内で多くの 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 まで急増しますが、これは私には少し多すぎます。

通常、内側のループを でラップするautoreleasepoolと問題は解決しますが、関数で試してみると、次のasyncエラーが発生します。

Cannot pass function of type '() async -> ()' to parameter expecting synchronous function type

これを回避する方法はありますか?または、ループ内で Cocoa オブジェクトを解放するという同じ目標を達成する別の方法はありますか?

4

1 に答える 1