ブロック内の保持サイクルを壊すことに関する膨大な数の質問から、私の質問は次のとおりです。
__weak
ブロックは内部の参照を実際にどのように処理しますか?
私はこれを認識しています(ここから取得):
ブロックは、コピー時に、それを囲むスコープから使用する NSObject を保持します。
__weak
では、資格の所有権はどのように処理されるのでしょうか。理論的に__weak
は保持されないのでしょうか?それへの参照を保持するだけですか?
ブロック内の保持サイクルを壊すことに関する膨大な数の質問から、私の質問は次のとおりです。
__weak
ブロックは内部の参照を実際にどのように処理しますか?
私はこれを認識しています(ここから取得):
ブロックは、コピー時に、それを囲むスコープから使用する NSObject を保持します。
__weak
では、資格の所有権はどのように処理されるのでしょうか。理論的に__weak
は保持されないのでしょうか?それへの参照を保持するだけですか?
正解です。弱参照は保持されません。期待どおりに正確に機能します。nil
オブジェクトの割り当てが解除されると、これらは に設定されます。
これは一般的には良いことですが (単にブロックが存在するだけで保持されるのは望ましくありません)、問題になる場合もあります。ブロックが実行されると、そのブロックの実行中 (ブロックの実行前ではなく) 保持されるようにしたいことがよくあります。weakSelf
そのために、 /strongSelf
パターンを使用できます。
__weak MyClass *weakSelf = self;
self.block = ^{
MyClass *strongSelf = weakSelf;
if (strongSelf) {
// ok do you can now do a bunch of stuff, using strongSelf
// confident that you won't lose it in the middle of the block,
// but also not causing a strong reference cycle (a.k.a. retain
// cycle).
}
};
そうすれば、保持サイクルはなくなりますが、単独で使用した場合に発生する可能性のある例外やその他の問題が発生することを心配する必要はありませんweakSelf
。
このパターンは、David が参照した ARC への移行リリース ノートのUse Lifetime Qualifiers to avoid Strong Reference Cyclesの「非自明なサイクル」の説明に示されています。
弱い参照は弱くキャプチャされるため、それらを指すオブジェクトは、ブロックの存続期間中、必ずしも存続するとは限りません。