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 nanil
w 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.