Чтобы лучше проиллюстрировать вопрос, рассмотрим следующую упрощенную форму рекурсии блоков:
__block void (^next)(int) = ^(int index) {
if (index == 3) {
return;
}
int i = index;
next(++i);
};
next(0);
XCode (ARC-enabled) предупреждает, что "Capturing" next "сильно в этом блоке, вероятно, приведет к циклу сохранения".
Согласен.
Вопрос 1. Будет ли успешно сохранен цикл сохранения, установив сам блок на nil
следующим образом:
__block void (^next)(int) = ^(int index) {
if (index == 3) {
next = nil; // break the retain cycle
return;
}
int i = index;
next(++i);
};
next(0);
(Примечание: вы все равно получите такое же предупреждение, но, возможно, оно необоснованное)
Вопрос 2: Какова была бы лучшая реализация рекурсии блоков?
Спасибо.