我正在查看Apple 示例代码中 Square Cam 的一些示例代码。我想在使用 ARC 的现代项目中复制它的一些功能。但是,有大量的 require 语句,例如:
BOOL success = (destination != NULL);
require(success, bail);
这会产生编译器错误:
转到受保护的范围。
我的问题是——在使用 ARC 的项目中处理此类语句的适当方法是什么?
我正在查看Apple 示例代码中 Square Cam 的一些示例代码。我想在使用 ARC 的现代项目中复制它的一些功能。但是,有大量的 require 语句,例如:
BOOL success = (destination != NULL);
require(success, bail);
这会产生编译器错误:
转到受保护的范围。
我的问题是——在使用 ARC 的项目中处理此类语句的适当方法是什么?
我遇到了同样的问题(使用相同的示例代码)。代码如下所示:
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
}
它为我解决了这个问题。通过查看这个,我还了解到您有时可以扩展构建错误以获取更多详细信息。
显然bail
是在一个或多个__block
变量的范围内;这是不允许的。有关更多信息,请参阅http://clang.llvm.org/compatibility.html#blocks-in-protected-scope。__block
提出的解决方案是通过将变量放在大括号分隔的块中来限制变量的范围。这可能并不总是有效;YMMV。
我正在为@Lewis42 答案添加一些描述。
如果你不把变量放在它自己的范围内,你会在 goto 之后绕过所有变量的初始化,当 ARC 试图清理它时,它最终会试图释放一些随机的内存。
如果您不想将变量放在自己的范围内,请确保不应在 goto 关键字下声明任何变量。
__block 需要特殊的运行时初始化。跳转到 __block 变量的范围会绕过此初始化,从而使变量的元数据处于无效状态。