Per meglio illustrare la questione, si consideri la seguente forma semplificata del blocco ricorsione:Block ricorsione e rompere mantenere ciclo
__block void (^next)(int) = ^(int index) {
if (index == 3) {
return;
}
int i = index;
next(++i);
};
next(0);
XCode (ARC-abilitato) avverte che "Capturing 'prossimo' fortemente in questo blocco è probabile che porti a un ciclo di conservazione ".
Concordato.
Domanda 1: Sarebbe il mantenere ciclo di essere rotto con successo impostando il blocco stesso a nil
, in questo modo:
__block void (^next)(int) = ^(int index) {
if (index == 3) {
next = nil; // break the retain cycle
return;
}
int i = index;
next(++i);
};
next(0);
(Nota: si sarebbe ancora ottenere il stesso avviso, ma forse è ingiustificato)
Domanda 2: quale sarebbe una migliore implementazione della ricorsione a blocchi?
Grazie.
Perché è stato dichiarato __block comunque? Non è catturato. –
@Catfish_Man, è '__block int i' perché è stato modificato nella riga successiva del codice. – krisk
Questo codice non potrebbe funzionare; next non è assegnato fino a quando il blocco non viene compilato. Pertanto, la chiamata al prossimo all'interno del blocco si bloccherà. –