を使用してループ内で多くの 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 オブジェクトを解放するという同じ目標を達成する別の方法はありますか?