ios – 阻止递归和打破保留周期

栏目: IOS · 发布时间: 7年前

内容简介:http://stackoverflow.com/questions/14839571/block-recursion-and-breaking-retain-cycle

为了更好的说明这个问题,请考虑以下简单的块递归形式:

__block void (^next)(int) = ^(int index) {
    if (index == 3) {
        return;
    }
    int i = index;
    next(++i);
};
next(0);

XCode(启用ARC)警告“在此块中强烈捕获”可能导致保留周期“.

同意.

问题1:通过将块本身设置为零,保留周期将成功地被破坏:

__block void (^next)(int) = ^(int index) {
    if (index == 3) {
        next = nil; // break the retain cycle
        return;
    }
    int i = index;
    next(++i);
};
next(0);

(注意:你仍然会得到同样的警告,但也许是无理的)

问题2:块递归更好的实现是什么?

谢谢.

为了实现无保留循环的递归块执行,您需要使用两个块引用 – 一个弱和一个强.所以对于你的情况,这是代码可能是什么样子:

__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)以保持该块.两个引用指向相同的块.

参见 http://stackoverflow.com/a/19905407/1956124 另一个例子,该模式也使用块递归.此外,以下文章的评论部分的讨论也与此相关: http://ddeville.me/2011/10/recursive-blocks-objc/

http://stackoverflow.com/questions/14839571/block-recursion-and-breaking-retain-cycle


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

精通Web Analytics 2.0

精通Web Analytics 2.0

[美]Avinash Kaushik / 郑海平、邓天卓 / 清华大学出版社 / 2011-4-26 / 48.00元

向数据驱动型决策转变以及如何利用网站数据来获得竞争优势 在过去几年中,互联网、在线营销以及广告经历了巨大的变革,然而大家处理数据的方式跟几十年前相比还是大同小异,停滞不前。网站分析领域的领跑者Analytics kaushik通过《精通Web Analytics 2.0——用户中心科学与在线统计艺术》提出了下一代网站分析的框架,将能很大程度地帮助你提高组织的能动性和对市场的反应速度。 ......一起来看看 《精通Web Analytics 2.0》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具