1

好的,所以在我尝试向我的项目中添加一些第三方代码之前,我一直很高兴在我的项目中使用 ARC。我将文件夹拖入(不是项目文件,只是一些视图控制器源文件)。3rd 方代码不是 ARC,所以我做了Edit->Refactor->Convert To Objective-C ARC并仅选择 3rd 方应用程序中的文件转换为 ARC。一切都很顺利,但我开始在我之前工作的代码中收到以下警告:

TTKSoundGenerator.m:94:10: warning: '__bridge' casts have no effect when not using ARC [-Warc-bridge-casts-disallowed-in-nonarc]
        (__bridge CFStringRef)soundFile,
         ^~~~~~~~
1 warning generated.

这是出现问题的第一个线索。我继续构建并运行,果然应用程序崩溃了,在东西被释放的地方仍然被引用。因此,尽管Objective-C 自动引用计数在项目文件中设置为YES ,但 ARC 根本不起作用。

我回去对项目中的所有文件进行了Edit->Refactor->Convert To Objective-C ARC,希望能纠正这个问题,但没有骰子。所以现在这个项目陷入了 ARC 的困境。似乎在进行重构时取消选择文件以某种方式告诉 Xcode 向这些文件添加“无 ARC”的特殊情况。关于如何解决或进一步诊断此问题的任何想法?

4

3 回答 3

2

无需将您的第 3 部分库转换为 ARC,同一项目中可以同时拥有 ARC 代码和非 ARC 代码。由于您的第 3 部分库未编写为 ARC,因此如果您按原样使用它,您可以节省大量额外的工作。(特别是如果您需要更新它)

如果您决定在项目中使用它,我认为可以公平地假设在没有 ARC 的情况下正确编写了第 3 部分库。

看到这个:

是否可以结合非 ARC 和 ARC 项目代码?

于 2012-08-17T09:02:11.033 回答
1

好吧,很明显,如果您在项目上执行Edit->Refactor->Convert To Objective-C ARC并且只选择一些要转换的文件,那么 Xcode 会将其余文件标记为 No ARC。设置该选项后,再次对所有文件运行Edit->Refactor->Convert To Objective-C ARC没有进一步的效果。修复方法是转到您的项目设置,在Build Phases->Compile Sources下,选择要重新启用 ARC 的文件并删除重构添加的 -fno-objc-arc 编译器标志。

于 2012-08-17T13:06:15.267 回答
0

ACR 转换工具非常强大且非常方便,但您通常应该以与您的想法完全相反的方式使用它。

如果您有一个 ARC 项目并且您添加了一个不符合 ARC 的类。你有两个选择:

1) mark the file as not using ARC (recommended for 3rd party classes)
2) convert the file to use ARC

ARC 转换工具可以执行这些任务中的任何一个,让您不必记住 f-no-whatsit 的语法以及手动设置标志的位置:

对于案例 1) 运行该工具并勾选除非ARC 类之外的每个文件。ARC 转换工具不会对已经符合 ARC 的文件执行任何操作,并且任何未选中的文件都将添加 -fno-objc-arc 标志。

对于案例 2) 运行该工具并勾选每个文件,包括新类。ARC 转换工具现在只会将此文件转换为 ARC,而不会影响其他文件。

直觉上你会期望如果一个文件已经是 ARC,你应该不选中它,但实际上这样做会导致 ARC 转换工具用 -fno-objc-arc 标志标记这些文件。

于 2012-11-24T11:48:41.343 回答