Bloqueia a recursão e quebra o ciclo de retenção

Para ilustrar melhor a questão, considere a seguinte forma simplificada de recursão de bloco:

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

XCode (habilitado para ARC) avisa que "Capturar "próximo" fortemente neste bloco provavelmente levará a um ciclo de retenção".

Acordado.

Questão 1: Será que o ciclo de retenção seria quebrado com êxito, definindo o próprio bloco paranildesta maneira:

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

(Nota: você ainda receberia o mesmo aviso, mas talvez seja injustificado)

Questão 2: Qual seria uma implementação melhor de recursão de bloco?

Obrigado.

questionAnswers(2)

yourAnswerToTheQuestion