33

は私の巣は、別のブロックならば、私はすでに、そのブロック内ネストされたブロック内の弱い自己を参照

__weak typeof(self) weakSelf = self; 
[self doABlockOperation:^{ 
     ... 
    }]; 

を使用して、弱い自己を作成すると? weakSelfへの別の弱い参照を作成する必要がありますか?

__weak typeof(self) weakerSelf = weakSelf; 
[weakSelf doAnotherBlockOperation:^{ 
       [weakerSelf doSomething]; 
    } 

答えて

19

です。

実際にブロックを保存している場合は、保持サイクルのみを作成します(selfがブロックを指し、ブロックポイントがselfになるため)。いずれかのブロックを保存しない場合は、selfへの強い参照を使用すると十分です。ブロックは実行後最初に解放され、次にポインタはselfに解放されます。

特定の例では、表示されていない操作を実行していない限り、weakerWeakerEvenWeakerSelfを作成する必要はありません。

+0

だから私は、例えば、自己のブロックを保持している場合、弱い自己に関する部分が必要とされている理解しています。しかし、私はどのような操作を行うことができます、私は弱い自分自身を必要とするでしょうか? –

+0

実際、弱いポインタは参照カウントを増やさないとマークされているので、弱いものにする方法はありません。 –

55

弱い参照は、弱いオブジェクトのretainCountを増やさないよう明示的にARCに指示するので、保持サイクルで保持されません。しかし、ベストプラクティスのために、弱いものを使用してオブジェクトの強い参照を作成する必要があります。これは、ブロック内の強力なポインタがブロックが完了するまで存在する(それはスコープだけがブロック自体である)ため、保持サイクルを作成しません。

__weak typeof(self) weakSelf = self; 
[self doABlockOperation:^{ 
    __strong typeof(weakSelf) strongSelf = weakSelf; 
    if (strongSelf) { 
     ... 
    } 
}]; 
+1

弱点を使ってオブジェクトへの強い参照を作成する必要がある理由についてもう少し詳細を教えてください。 1または2の実用的なケースが多くを助けるでしょう。ありがとう。 –

+2

良いことは、ブロック実行時にオブジェクトがまだ存在していることを天気を安全にチェックできることです。それ以外の場合は、nilを呼び出すことになります。これは、ブロックがあまり機能しないことを意味します。あなたが見ているアドバイス[WWDC 2012のこのビデオ](https://developer.apple.com/videos/wwdc/2012/?id=712);)。 –

+1

@EnzoTran:ブロックが実行されるまでに 'self'が有効なオブジェクトであることがわかっているので、弱参照は「安全」なので、強い参照を作成したいとします。しかし、内側のブロックが実行されるまでには割り当て解除されないという保証はないため、強い参照を取得する必要があります。 – newacct

関連する問題