kri*_*isk 16 objective-c ios objective-c-blocks automatic-ref-counting
为了更好地说明问题,请考虑以下简化形式的块递归:
__block void (^next)(int) = ^(int index) {
if (index == 3) {
return;
}
int i = index;
next(++i);
};
next(0);
Run Code Online (Sandbox Code Playgroud)
XCode(启用ARC)警告" 在此块中强烈捕获'下一个'可能会导致保留周期 ".
同意.
问题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);
Run Code Online (Sandbox Code Playgroud)
(注意:你仍然会得到同样的警告,但也许是没有根据的)
问题2:块递归的更好实现是什么?
谢谢.
小智 5
要完成无保留循环的递归块执行,您需要使用两个块引用 - 一个弱引用和一个强引用。所以对于你的情况,这就是代码的样子:
__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);
Run Code Online (Sandbox Code Playgroud)
请注意,块捕获弱块引用(weak_next),外部上下文捕获强引用(next)以保持块。两个引用都指向同一个块。
有关此模式的另一个示例,请参阅/sf/answers/1393378521/,该示例也使用块递归。此外,以下文章的评论部分中的讨论也与此处相关:http : //ddeville.me/2011/10/recursive-blocks-objc/
归档时间: |
|
查看次数: |
1904 次 |
最近记录: |