質問をよりよく説明するために、次の簡略化された形式のブロック再帰を検討してください。
__block void (^next)(int) = ^(int index) {
if (index == 3) {
return;
}
int i = index;
next(++i);
};
next(0);
XCode(ARC対応)は、「このブロックで「次へ」を強くキャプチャすると、保持サイクルが発生する可能性が高い」と警告しています。
同意しました。
質問1nil
:次のように、ブロック自体をに設定することで、保持サイクルを正常に中断できますか?
__block void (^next)(int) = ^(int index) {
if (index == 3) {
next = nil; // break the retain cycle
return;
}
int i = index;
next(++i);
};
next(0);
(注:同じ警告が表示されますが、おそらくそれは保証されていません)
質問2:ブロック再帰のより良い実装は何でしょうか?
ありがとう。