4

在 Xcode 4.5 中编译旧项目时,会出现警告:

'__bridge' 强制转换在不使用 ARC 时无效

消除此警告的正确方法是什么,以使代码在 ARC 和非 ARC 项目中都能正常工作?

4

3 回答 3

5

任何单独的源文件都必须使用 ARC 编译或不使用 ARC 编译。您应该下定决心,并始终对特定的源文件使用该方法。如果您坚持内存管理命名约定,您可以在同一个项目中混合使用 ARC 和非 ARC 源文件。

我上面说的原因是,如果你有为 ARC 编写的代码并且你在没有 ARC 的情况下编译它,那么由于所有的保留、释放和自动释放的事实,整个地方都会出现内存泄漏和过早的释放缺失。

于 2012-09-20T09:16:24.457 回答
0

使用一些#define's 很可能编写为 MRC、ARC 和 GC 中的一个以上正确编译的源文件。

Xcode 不允许你同时启用 ARC 和 GC,知道我们可以这样写:

#if defined(__OBJC_GC__)
#  define USING_GC 1
#else
#  define USING_GC 0
#endif

#if __has_feature(objc_arc)
#  define USING_ARC 1
#else
#  define USING_ARC 0
#endif

#if USING_ARC || USING_GC
#  define USING_MRC 0
#else
#  define USING_MRC 1
#endif

它将仅定义USING_GC,USING_MRCUSING_ARCas 中1的一个,而其他两个 as 0。你可以把它放在你的项目前缀头(.pch)中。

您可以在代码中直接使用这些定义来包含/排除诸如桥接演员之类的内容;或者更好地定义用于内存调用、强制转换等的宏,这些宏会根据使用的内存模型扩展为适当的代码。

高温高压

于 2012-09-20T10:16:29.110 回答
0

只需为该文件打开 ARC:

-fobjc-arc

(转到构建阶段 > 编译源 > 编译器标志)

于 2013-09-24T03:26:06.003 回答