我有一个运行良好的应用程序。然后我尝试将导航控制器嵌入到选项卡控制器中,接下来我知道我在编译过程中开始出现这些错误。
有人知道为什么会发生这种事吗?是某些设置未检查还是意外检查?
谢谢,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编译,这破坏了你的代码。
尝试重构代码。检查一下。