禁用某些文件的自动引用计数


183

我已经下载了iOS 5 SDK,并发现ARC是新Apple编译器的一项强大功能。目前,许多第三方框架不支持ARC。我可以使用ARC作为新代码并保持当前的保留/发布代码不变吗?ARC转换器在这里不起作用,因为某些框架(例如JSONKit)无法使用该转换器转换为ARC。

编辑:

答案是为-fno-objc-arc不需要ARC的文件添加到编译器标志。在Xcode 4中,您可以在目标->构建阶段->编译源代码下执行此操作。



2
为了澄清,您只需将其添加到.m文件中。不是.h文件。
ma11hew28 2011年

我发现了这个对话:github.com/gowalla/AFNetworking/issues/36也许它可以帮助某人如何将JSONKit集成到iOS5 ARC支持的项目中;-)但目前我还没有尝试过……

这种方法对我有用。我向我的项目添加了用于UDP多播的AsyncUdpSocket,并且这些文件(至少是当前版本)不支持ARC。因此,我使用上面的方法将编译器标志添加到AsyncUdpSocket.m文件中,并且我可以使代码与我的应用程序正常工作。
阿舒·乔希

2
这很完美!详细信息:转到目标并选择构建阶段,然后选择编译源。如果双击有问题的.m文件,它将弹出一个框,您可以在其中键入/粘贴:“ -fno-objc-arc”
mpemburn

Answers:


73

公开的ARC文档虽然在这一点上尚不明确,但似乎建议,只要每个类都是全部ARC或所有手动管理的类,就可以将这些类集成到单个程序中。

您只能将ARC和非ARC混为一类。的文件说,发送retainreleaseautorelease,或retainCount通过任何手段(包括计时器和延迟进行,其使用消息@selector)在ARC代码禁止。因此,您不能在ARC类中执行非ARC(因为禁止了必要的消息),并且您不能在非ARC类中执行ARC(因为ARC添加了没有ARC时无效的语法元素)。

关于是否可以将非ARC库/框架集成到ARC程序中,同一文档更加清晰:是。它没有提及您是否可以在所有代码都不为ARC的程序中使用ARC库/框架,但是鉴于上述所有情况,其含义似乎是肯定的。


谢谢!我已经弄清楚了如何为现有的非ARC类禁用ARC。
2011年

您能与我们分享您的工作吗?
David H

1
@David H:如果您打算将其发送给提问者,则应注意,提问者将他们的解决方案编辑成了问题。
彼得·霍西

无法在HEADER文件中禁用ARC编译。Clang不会基于其实现/方法文件的编译来编译接口/头。因此,在混合编译中,头文件必须与ARC和非ARC兼容。我认为这是编译器中的错误。
carmin 2013年

1
@carmin:不是。编译器不会查看头文件,除非您告知头文件,通常您只能#import从模块文件中读取它们。编译器标志设置适用于每个模块文件(更准确地说,是“编译源”构建阶段中的每个文件)。编译器没有办法知道是否应将ARC用于其他任何文件,除非继承了为其最初使用的模块文件指定的选择。
Peter Hosey

78

如何禁用多个文件上的ARC并不是很直观,一段时间以来,我一直一步一步地进行操作,直到弄清楚如何做。

  1. 在Xcode的“目标/构建阶段/编译源”中选择所需的文件(CMD +单击或Shift +单击)
  2. 按ENTER键(双击将重置选择,因此它不起作用)
  3. 输入-fno-objc-arc
  4. 按Enter或完成

1
这并不是对这里提出的问题的真正答案,但无论如何都是一个血腥的好提示!投票+1
Kristof Van Landschoot 2012年

您说的没错,但事实并非如此,但我一直只是在谷歌上搜索该开关,而这是最受好评的答案之一。我认为这些天大多数人已经知道了答案,但还不知道这个“提示”
Tibidabo

35

如果要禁用某些文件的自动引用计数,则只需执行以下步骤即可。在目标->构建阶段->编译源中添加编译器标志。

代码

所使用的标志是-fno-objc-arc,写完后按Enter。您必须双击“编译器标志”下该行的右列。希望对您有所帮助:)


14
您可以使用相同的方法通过使用标志在非ARC项目中的特定文件上启用 ARC -fobjc-arc
lnafziger

无法在HEADER文件中禁用ARC编译。Clang不会基于其实现/方法文件的编译来编译接口/头。因此,在混合编译中,头文件必须与ARC和非ARC兼容。我认为这是编译器中的错误。
carmin 2013年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.