Rekursion blockieren und Retain-Zyklus unterbrechen
Betrachten Sie die folgende vereinfachte Form der Blockrekursion, um die Frage besser zu veranschaulichen:
__block void (^next)(int) = ^(int index) {
if (index == 3) {
return;
}
int i = index;
next(++i);
};
next(0);
XCode (ARC-fähig) warnt, dass "Das starke Erfassen von 'next' in diesem Block führt wahrscheinlich zu einem Beibehaltungszyklus".
Einverstanden.
Frage 1: Würde der Retain-Zyklus erfolgreich abgebrochen, wenn der Block selbst auf gesetzt würdenil
, in dieser Mode:
__block void (^next)(int) = ^(int index) {
if (index == 3) {
next = nil; // break the retain cycle
return;
}
int i = index;
next(++i);
};
next(0);
(Hinweis: Sie würden immer noch die gleiche Warnung erhalten, aber möglicherweise ist dies nicht gerechtfertigt.)
Frage 2: Was wäre eine bessere Implementierung der Blockrekursion?
Vielen Dank.