为了更好地说明问题,考虑以下简化形式的块递归:
__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:块递归的更好实现方法是什么?
谢谢。
next
在块内部直到由于其__block
存储说明符而被执行时才会绑定。bbum的“Block Tips and Tricks”帖子中有关于此的内容。无论如何,递归块肯定是可能的。 - jscs