Rekurencja bloku i przerwanie cyklu zatrzymania

Aby lepiej zilustrować pytanie, rozważ poniższą uproszczoną formę rekursji blokowej:

__block void (^next)(int) = ^(int index) {
    if (index == 3) {
        return;
    }
    int i = index;
    next(++i);
};
next(0);

XCode (z obsługą ARC) ostrzega, że ​​„Mocne przechwycenie „następnego” w tym bloku prawdopodobnie doprowadzi do cyklu zatrzymania„

Zgoda.

Pytanie 1: Czy cykl zatrzymania zostanie pomyślnie przerwany przez ustawienie samego bloku nanilw ten sposób:

__block void (^next)(int) = ^(int index) {
    if (index == 3) {
        next = nil; // break the retain cycle
        return;
    }
    int i = index;
    next(++i);
};
next(0);

(Uwaga: nadal otrzymasz to samo ostrzeżenie, ale być może jest to nieuzasadnione)

pytanie 2: Jaka byłaby lepsza implementacja rekurencji blokowej?

Dzięki.

questionAnswers(2)

yourAnswerToTheQuestion