self
に限らず weak
キャプチャしたオブジェクトが異なるスレッドで解放される可能性がある場合、リファレンスカウントの減少から deinit
の実行までは排他的でもアトミックでもないと思うんですが、そうすると weak
キャプチャしてる側で常にぶっ壊れる可能性がないですか?異なるスレッドからの解放はそもそもやっちゃいけない?self?.foo()
を呼び出したときに、 self
のリファレンスカウントをチェックしたときは 1 だったけど、 foo
が呼ばれる前に別スレッドから self
が解放されてしまったとか。guard let
self = self else { return }
してると一見安全そうだけど、この場合でもリファレンスカウントのチェックから代入してリファレンスカウント増やすまでの間に別スレッドから解放されてしまうおそれがありそう。 (edited)