私はすでに弱い自己を使用して作成すると仮定します
__weak typeof(self) weakSelf = self;
[self doABlockOperation:^{
...
}];
そのブロック内で、別のブロックをネストすると:
[weakSelf doAnotherBlockOperation:^{
[weakSelf doSomething];
}
保持サイクルを作成しますか? weakSelfへの別の弱い参照を作成する必要がありますか?
__weak typeof(self) weakerSelf = weakSelf;
[weakSelf doAnotherBlockOperation:^{
[weakerSelf doSomething];
}
場合によります。
ブロックを実際に保存する場合にのみ、保持サイクルを作成します(self
はブロックを指し、ブロックはself
を指すため)。どちらのブロックも保存するつもりがない場合は、self
への強い参照を使用するだけで十分です---ブロックは実行後に最初に解放され、その後self
へのポインターを解放します。
特定の例では、表示されていない操作をさらに実行しない限り、weakerWeakerEvenWeakerSelfsを作成する必要はありません。
コードは正常に機能します。弱いオブジェクトのretainCountを増加しないようにARCに明示的に指示するため、弱い参照は保持サイクルを引き起こしません。ただし、ベストプラクティスとして、弱いオブジェクトを使用してオブジェクトの強力な参照を作成する必要があります。ブロック内の強力なポインターはブロックが完了するまでしか存在しないため、保持サイクルは作成されません(スコープはブロック自体のみです)。
__weak typeof(self) weakSelf = self;
[self doABlockOperation:^{
__strong typeof(weakSelf) strongSelf = weakSelf;
if (strongSelf) {
...
}
}];