【发布时间】:2013-07-01 19:21:44
【问题描述】:
我有一个运行良好的应用程序。然后我尝试将导航控制器嵌入到 tabbarcontroller 中,接下来我知道我在编译期间开始收到这些错误。
有人知道为什么会这样吗?某些设置是否未选中或被意外选中?
谢谢, 亚历克斯
【问题讨论】:
标签: ios ios6 automatic-ref-counting reference-counting
我有一个运行良好的应用程序。然后我尝试将导航控制器嵌入到 tabbarcontroller 中,接下来我知道我在编译期间开始收到这些错误。
有人知道为什么会这样吗?某些设置是否未选中或被意外选中?
谢谢, 亚历克斯
【问题讨论】:
标签: ios ios6 automatic-ref-counting reference-counting
您之前的工作代码似乎没有使用 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 会为您添加 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。
【讨论】:
错误出现在新代码上?
在这种情况下,我认为您的项目启用了 ARC,当您尝试嵌入 UINavigationController 时,您插入了一些非 ARC 代码。
你改编译器了吗?
LLVM 编译器引入了 ARC。如果您正在开发一个非 ARC 项目,那么您可能只是使用 LLVM 编译而破坏了您的代码。
尝试重构代码。 Check this.
【讨论】: