为了更好地说明问题,请考虑以下块递归的简化形式:
__block void (^next)(int) = ^(int index) {
if (index == 3) {
return;
}
int i = index;
next(++i);
};
next(0);
XCode(启用 ARC)警告“在此块中强烈捕获“下一个”可能会导致保留周期".
Agreed.
问题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:更好的块递归实现是什么?
Thanks.
要完成无保留周期递归块执行,您需要使用两个块引用 - 一个弱引用,一个强引用。因此,对于您的情况,代码可能如下所示:
__block __weak void (^weak_next)(int);
void (^next)(int);
weak_next = next = ^(int index) {
if (index == 3) {
return;
}
int i = index;
weak_next(++i);
};
next(0);
请注意,该块捕获弱块引用(weak_next),外部上下文捕获强引用(next)以保留该块。两个引用都指向同一个块。
See https://stackoverflow.com/a/19905407/1956124 https://stackoverflow.com/a/19905407/1956124此模式的另一个示例,它也使用块递归。此外,以下文章评论部分的讨论也与此相关:http://ddeville.me/2011/10/recursive-blocks-objc/ http://ddeville.me/2011/10/recursive-blocks-objc/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)