你如何处理ARC的'require(...,bail)'陈述?

时间:2012-07-09 03:43:49

标签: objective-c ios automatic-ref-counting llvm

我正在查看Square Cam in Apple's sample code的一些示例代码。我想在使用ARC的现代项目中复制它的一些功能。但是,有大量的需求声明,例如:

BOOL success = (destination != NULL);
require(success, bail);

生成编译器错误:

  

转到受保护的范围。

我的问题是 - 在使用ARC的项目中处理此类语句的适当方法是什么?

3 个答案:

答案 0 :(得分:10)

我遇到了同样的问题(使用相同的示例代码)。代码看起来像这样:

BOOL success = (destination != NULL);
require(success, bail);

//Initialise some variables

bail:
//Deal with errors

我在声明块周围添加了大括号,以使其范围清晰:

BOOL success = (destination != NULL);
require(success, bail);
{
    // *** Initialise some variables ***
}
bail:
{
    //Deal with errors
}

它解决了我的问题。通过观察这一点,我还了解到,有时可以扩展构建错误以获得更多细节。

答案 1 :(得分:3)

显然bail位于包含一个或多个__block变量的范围内;这是不允许的。有关详情,请参阅http://clang.llvm.org/compatibility.html#blocks-in-protected-scope。提出的解决方案是通过将它们放在以大括号分隔的块中来限制__block变量的范围。这可能不会总是有效; YMMV。

答案 2 :(得分:0)

我正在为@ Lewis42答案添加一些描述。

如果你没有把变量放在自己的范围内,你可以在goto之后绕过所有变量的初始化,当ARC试图清理它时,它最终会尝试释放一些随机的内存。

如果您不想将变量放在自己的范围内,请确保不应在goto关键字下面声明任何变量。

Jumps to within __block variable scope

  

__ block需要特殊的运行时初始化。跳转到__block变量的范围会绕过这个初始化,留下   变量的元数据处于无效状态。