0

ブロック内で自己をキャプチャすることを回避する一般的なパターンは、ブロックの外側に弱い自己を作成し、これを使用してブロック内に自己の「ローカルに強い」バージョン (内部自己) を作成することです。

__weak ClassX *weakSelf = self;
[someOtherObject methodThatTakesCOmpletionBlock: ^{

             ClassX innserSelf = weakSelf; //innserSelf creation?     
             [someObject send:innerSelf.prop;}];

innserSelf creation行が実行されるとどうなりますか? メソッドが に送信された時点で、selfinnerSelfコピーですか?methodThatTakesCompletionBlock:someOtherObject

この質問は、innserSelf 行が実行されたときに何が起こるかに焦点を当てています。関連するブロック内の弱い参照への強い参照を見てきましたが、この点に対処していません。

4

2 に答える 2

3

検討:

 __weak id weakSelf = self;
 [other doSomething: ^{
     __strong id strongSelf = weakSelf;
     ....
 }];

ブロックをコピーするときother、強い参照はありません。

otherがブロックを実行すると、ブロックの実行の開始時に強参照が作成されます。ブロックが完了すると、実行スコープがなくなるため、strongSelf参照が破棄されます。

otherブロックにぶら下がっているかどうかは関係ありません。strongSelf参照はブロックの実行中にのみ存在します

于 2016-10-10T01:17:00.447 に答える
0

弱いポインターを強いポインターに割り当てても、オブジェクトはコピーされません。どちらのポインターも同じオブジェクトを指します。ストロング ポインターが保持されるため、保持カウントに +1 が加算されます。ウィーク ポインターは保持カウントを変更しません。

于 2016-10-09T01:17:30.007 に答える