你如何处理“需要(...,保释)”与ARC陈述?(How do you handle 're

2019-09-19 06:11发布

我期待通过一些的示例代码在苹果的示例代码广场凸轮 。 我想复制它的一些使用ARC现代化项目的功能。 然而,有一吨的要求语句,如:

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

其生成编译器错误:

转到进入保护范围。

我的问题是 - 什么是处理在使用ARC项目,例如报表进行了相应的方法?

Answer 1:

我有同样的问题(具有相同的示例代码)。 该代码是这样的:

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
}

它解决了这个问题对我来说。 通过看这个我也了解到你有时可以扩展生成错误,以获得更多的细节。



Answer 2:

显然bail与一个或多个范围__block变量; 这是不允许的。 见http://clang.llvm.org/compatibility.html#blocks-in-protected-scope更多。 该解决方案提出的有,以限制的范围__block变量(S),通过将它们在括号分隔的块。 这可能并不总是有效; 因人而异。



Answer 3:

我加入了@ Lewis42回答一些说明。

如果你不把变量在自己的范围内,你绕过所有变量的初始化后藤后,当ARC试图把它清理干净,它会最终要释放的内存的随机位。

如果你不想把变量在自己的范围内确保任何变量应不低于转到关键字来声明。

跳到__block可变范围内

__block需要特殊的运行时初始化。 跳转到__block变量的作用域绕过这个初始化,使变量的元数据处于无效状态。



文章来源: How do you handle 'require( …, bail)' statements with ARC?