swift_release
は関係なかったです。キャプチャ時のretainに対応するreleaseが _ = await old?.value
の直後に入るのでキャプチャする側のクロージャが解放される前にTaskを手放せるからリークしない、ということでした。 (edited)old
を var
にして、以下のように明示的に解放すると確実に安全で良いと思います。 現状リークしないのはコンパイラのコード生成のブレに依存してるようです。 _ = await old?.value old = nil