ios - 'autorelease is unavailable'错误和'ARC禁止显式消息发送autorelease'错误

时间:2013-07-01 19:21:45

标签: ios ios6 automatic-ref-counting reference-counting

我有一个工作正常的应用程序。然后我尝试将导航控制器嵌入到tabbarcontroller中,接下来我知道在编译期间我开始收到这些错误。

有谁知道为什么会发生这种情况?某些设置是否未经检查或意外检查?

谢谢, 亚历

3 个答案:

答案 0 :(得分:6)

似乎您之前使用的代码没有使用ARC,现在您尝试将其嵌入到使用ARC的代码中...使用“编辑 - >转换 - >转换为对象-C ARC”重构您的代码

答案 1 :(得分:4)

每次翻译都启用ARC - 每个已编译的源文件及其通过包含看到的所有内容都必须遵守ARC或MRC。是的,模式可以共存(即,您可以为某些文件启用ARC,但不是全部,并且您链接到的库也可以使用)。

您有两种模式:

<强> ARC

禁止使用表达式[obj autorelease]。 ARC会为你添加它(除非你有不寻常的引用计数序列)。

在典型的情况下,你可以写:

// a method which returns an autoreleased object
- (NSArray *)something
{
  return [[NSArray alloc] initWithObjects:…YOUR_OBJECTS…];
}

然后ARC将为您添加autorelease

但如果你写:

- (NSArray *)something
{
  return [[[NSArray alloc] initWithObjects:…YOUR_OBJECTS…] autorelease];
}
在ARC中,它将是一个编译错误(如标题中的那个)。

<强> MRC

这是MRC表格:

- (NSArray *)something
{
  return [[[NSArray alloc] initWithObjects:…YOUR_OBJECTS…] autorelease];
}

您的项目可能默认使用ARC(即它在xcconfig中定义,在项目级别或目标级别定义),尽管您已添加了为MRC编写的源文件。

由于该文件已编译为ARC,因此您可以删除autorelease消息或disable ARC for the single file

答案 2 :(得分:1)

错误在新代码上?

在这种情况下,我认为您的项目已启用ARC,当您尝试嵌入UINavigationController时,您插入了一些非ARC代码。

您是否更改了编译器?

LLVM编译器引入了ARC。如果你正在开发一个非ARC项目,可能你只是用LLVM编译而且破坏了你的代码。

尝试重构代码。 Check this.