42

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

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

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

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

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

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

2 に答える 2

60

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

__weak typeof(self) weakSelf = self;
[self doABlockOperation:^{
    __strong typeof(weakSelf) strongSelf = weakSelf;
    if (strongSelf) {
        ...
    }
}];
于 2013-06-14T09:31:18.770 に答える
19

場合によります。

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

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

于 2013-06-14T09:22:13.960 に答える