'autorelease is unavailable'错误和'ARC forbids explicit message send of autorelease'错误



我有一个运行良好的应用程序。然后我尝试将导航控制器嵌入到选项卡控制器中,接下来我知道我在编译过程中开始出现这些错误。

有人知道为什么会发生这种事吗?是某些设置未检查还是意外检查?

谢谢,Alex

似乎您以前工作的代码没有使用ARC,现在您试图将其嵌入使用ARC的代码中。。。使用"Edit->Convert->Convert to Object-C ARC"重构代码

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

您有两种模式:

ARC

表达式[obj autorelease]被禁止。ARC将为您添加它(除非您有异常的参考计数序列)。

在典型的场景下,你可以写:

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

然后ARC会为您添加CCD_ 2。

但如果你写:

- (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消息或禁用单个文件的ARC。

错误在新代码上?

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

你改变编译器了吗?

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

尝试重构代码。检查一下。

最新更新