ブロックを作成またはコピーすると (たとえば、gcd にスケジュールするときにコピーされる可能性があります)、参照された変数がキャプチャされます (__block 指定子で宣言されていない場合)。強い参照は保持されますが、弱い参照は保持されません。
ローカルstrongSelf
変数を作成すると、ブロックが実行されている間(つまり、実行されずにプロパティに置かれている間は強い参照はありません)、その変数はself
生き続けます。直接参照すると -がキャプチャされて保持されますが、ブロックが生きている間保持されるようになりました。self
self
self
__weak id weakSelf = self;
[self.operationQueue addOperationWithBlock:^{
NSNumber* result = findLargestMersennePrime();
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
MyClass* strongSelf = weakSelf; // strong reference when block executes
[self foo]; // strong reference when block created/copied
strongSelf.textLabel.text = [result stringValue];
}];
}];
違いを見ます?直接参照を使用してオブジェクトへのすべての強力なポインターを削除してself
も、ブロック内にはまだ 1 つの強力な参照があり、それはキャプチャされて保持されたものです。同時に、ローカルポインターはブロックが実行されている間strongSelf
のみ強い参照を保持するため、既に死んでいる場合はnil になり、nil 値を取得します。self
self
weakSelf
strongSelf