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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage