3

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

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

谢谢,亚历克斯

4

3 回答 3

7

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

于 2013-07-01T19:25:53.213 回答
4

每次翻译都启用 ARC——每个编译的源文件以及它通过包含看到的所有内容都必须遵守 ARC 或 MRC。是的,这些模式可以共存(即您可以为某些文件启用 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消息或禁用单个文件的 ARC

于 2013-07-01T19:34:57.310 回答
1

错误在新代码上?

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

你改编译器了吗?

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

尝试重构代码。检查这个。

于 2013-07-01T19:32:02.197 回答