たとえば、self が 0x123 の場合、weakself も 0x123 を指しています。次に、strongSelf はブロック内で 0x123 に設定されます。これは保持サイクルになりませんか?
実は違う; それらはすべて同じものを直接指し示しているわけではありません。実際には、ARC の弱参照は実際に (舞台裏で) 追加のオブジェクトをミックスに挿入します。これをスクラッチパッド オブジェクトと呼びましょう。同じオブジェクトを指しているように見えますが、実際にはスクラッチパッド オブジェクトを指しているため、指しているものが保持されません。これが ARC の弱参照の仕組みです (弱参照のゼロ化とも呼ばれます)。それらは、それ自体を保持せずに保持できる特別な追加のスクラッチパッドオブジェクトを含み、チェーンを壊します。
リテイン サイクルでは、A は B にリテインを持ち、B は A にリテインを持っていdealloc
ます。
ブロックの状況では、A がブロックでself
、B がブロックです。self
何らかの理由でブロックに保持を設定します (多くの場合、コピーやオブザーバーなどに関係してかなりあいまいです。常に発生するとは限りません。実際、ほとんどの人が考えているよりもはるかにまれに発生します)。 . self
ブロックは、それがクロージャーであり、ブロック内で参照されているという事実だけで保持されself
ます。
しかし、弱強のダンスをすることで、これを防ぎます。ブロックに渡されるのはweakself
、実際にはスクラッチパッド オブジェクトを介した参照です。ブロックはこれを保持できますが、保持しませんself
。したがって、保持サイクルはありません。