你如何处理“要求(…,保释)”与ARC的声明?

我正在通过苹果示例代码中的方形凸轮的一些示例代码 。 我想用ARC来复制现代项目中的一些function。 但是,有大量的要求陈述,例如:

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 } 

它解决了我的问题。 通过看这个我也学会了你有时可以扩展构build错误来获得更多的细节。

显然bail是在一个或多个__blockvariables的范围内; 这是不允许的。 有关更多信息,请参阅http://clang.llvm.org/compatibility.html#blocks-in-protected-scope 。 提出的解决scheme是通过将它们放在大括号分隔的块中来限制__blockvariables的范围。 这可能不总是工作; 因人而异。

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

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

如果你不想把variables放在自己的范围内,确保任何variables不应该在goto关键字下面声明。

跳转到__blockvariables范围内

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