为了更好地说明这个问题,请考虑以下块递归的简化形式:
__block void (^next)(int) = ^(int index) {
if (index == 3) {
return;
}
int i = index;
next(++i);
};
next(0);
XCode(启用 ARC)警告“在此块中强烈捕获 '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:块递归的更好实现是什么?
谢谢。