我有一个工作正常的应用程序。然后我尝试将导航控制器嵌入到tabbarcontroller中,接下来我知道在编译期间我开始收到这些错误。
有谁知道为什么会发生这种情况?某些设置是否未经检查或意外检查?
谢谢, 亚历
答案 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.