我正在查看Square Cam in Apple's sample code的一些示例代码。我想在使用ARC的现代项目中复制它的一些功能。但是,有大量的需求声明,例如:
BOOL success = (destination != NULL);
require(success, bail);
生成编译器错误:
转到受保护的范围。
我的问题是 - 在使用ARC的项目中处理此类语句的适当方法是什么?
答案 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变量的范围会绕过这个初始化,留下 变量的元数据处于无效状态。