behalten brechen besser Um die Frage zu veranschaulichen, betrachten Sie die folgende vereinfachte Form Blockrekursion:Blockrekursion und Zyklus
__block void (^next)(int) = ^(int index) {
if (index == 3) {
return;
}
int i = index;
next(++i);
};
next(0);
XCode (ARC-fähige) warnt davor, dass "Capturing 'next' stark in diesem Block wahrscheinlich zu einem Rückhaltezyklus führen ".
Einverstanden.
Frage 1: Würde das behalten Zyklus erfolgreich, indem der Block selbst zu nil
, auf diese Weise gebrochen werden:
__block void (^next)(int) = ^(int index) {
if (index == 3) {
next = nil; // break the retain cycle
return;
}
int i = index;
next(++i);
};
next(0);
(Anmerkung: Sie würden immer noch die gleiche Warnung erhalten, aber vielleicht ist es ist ungerechtfertigt)
Frage 2: Was wäre eine bessere Implementierung der Blockrekursion?
Danke.
Warum wird der __block trotzdem deklariert? Es wird nicht erfasst. –
@Catfish_Man, es ist '__block int i', weil es in der nächsten Codezeile geändert wird. – krisk
Dieser Code könnte möglicherweise nicht funktionieren; next wird erst zugewiesen, wenn der Block kompiliert ist. Daher wird der Aufruf von next innerhalb des Blocks abstürzen. –