Avatar
値を返すTask(Future)は、Taskヒープオブジェクトの中の FutureFragment という領域に結果を保持しています。終了したTaskでも .value を呼べるならTaskヒープオブジェクトは生きてるのでそこから取ってくる。
7:43 AM
TaskをコピーするときはTask構造体のフィールドにNativeObjectがあるのでそれがリテインされる
7:45 AM
だからよく考えると今回のキャプチャチェインの問題は↑の swift_releaseは関係なかったです。キャプチャ時のretainに対応するreleaseが _ = await old?.value の直後に入るのでキャプチャする側のクロージャが解放される前にTaskを手放せるからリークしない、ということでした。 (edited)