web-dev-qa-db-ja.com

ネストされたブロック内の弱い自己を参照する

私はすでに弱い自己を使用して作成すると仮定します

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

そのブロック内で、別のブロックをネストすると:

[weakSelf doAnotherBlockOperation:^{
            [weakSelf doSomething];
}

保持サイクルを作成しますか? weakSelfへの別の弱い参照を作成する必要がありますか?

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

場合によります。

ブロックを実際に保存する場合にのみ、保持サイクルを作成します(selfはブロックを指し、ブロックはselfを指すため)。どちらのブロックも保存するつもりがない場合は、selfへの強い参照を使用するだけで十分です---ブロックは実行後に最初に解放され、その後selfへのポインターを解放します。

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

19

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

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