如何在非ARC的Xcode项目中,针对特定文件通过编程启用ARC?

4

我有一个情况,需要在几个非ARC的XCode项目中启用ARC。我不想完全转换为ARC,只需要启用其中的一些文件。

有许多解决方案,包括在使用XCode控制台的编译源中为特定文件添加-fobjc-arc标志。但是我有太多的文件在多个XCode项目中,无法逐个更改。

是否有一种方法可以通过编程方式修改构建阶段设置。 我找到了一些帖子,比如

这两个都是很好的解决方案,但我需要设置一种机制来编写脚本来管理它们。因为其中一些在服务器上运行,生成的XCode分发给其他人进行测试。

project.pbxproj代码的操纵似乎是最有可能的选择。但我不确定该如何去做。


你可以一次性更改它们所有的文件。https://dev59.com/AmrWa4cB1Zd3GeqP7Rsh - Grzegorz Krukowski
你尝试过在Xcode菜单中选择“编辑->重构->转换为Objective-C ARC”吗? - thorb65
这是一个非 ARC 项目,其中有几个启用了 ARC 的文件。 我会更改描述以说明这一点。 - Edwin Abraham
3个回答

2
如果你查看.xcodeproj文件中的.pbxproj文件,你可以看到项目包含的文件。如果你想手动修改标志,我有一些文件已经设置了编译器标志。在.pbxproj文件中,它们看起来像这样:
``` D5298D04170F232900D3B684 /* ASIHTTPRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = FACE22CF15B72C4C00A0A4AD /* ASIHTTPRequest.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; ```
而没有编译器标志的文件则是这样的:
``` D5298D02170F232900D3B684 /* GradientShapeView.m in Sources */ = {isa = PBXBuildFile; fileRef = FACE22C715B6F90000A0A4AD /* GradientShapeView.m */; }; ```
不知道为什么,在那个.pbxproj文件中这些编译器标志和文件每个都列出了4次。我有12个文件在项目中设置了编译器标志,但是该标志在该文件中被找到了48次。
你可以设置一个文本解析器来浏览这个文件,并将标志添加到你想要的特定文件中。我不知道你在这样做时会出现什么问题,但这是通过perl脚本向特定文件添加编译器标志的一种可行方式。

谢谢。这似乎是编辑编译器标志的唯一方法。至于标志出现四次,应该是因为KRelease、KDebug、Preview的引用也应该出现。那只有三次。不知道你怎么得到四次的。还必须有适用于所有文件的引用。 - Edwin Abraham
我本周遇到了mod_pbxproj。请查看我的回答以获取更多信息。 - andyzinsser

2

如果您想保持默认目标为非ARC,则有两个选项:

  1. 在编译源代码阶段为每个ARC文件启用-fobjc-arc
  2. 为您的ARC文件创建一个新的静态库目标(并为该目标启用ARC)

我需要以编程方式启用-fobjc-arc,因为有多个文件在多个Xcode项目中。我想在不打开XCode的情况下实现这一点。如果可能的话,使用perl(因为它正在使用perl脚本从远程服务器生成xcode)。 - Edwin Abraham

1
同时选择您要启用ARC的所有文件,然后按回车键。它会弹出一个文本框,您可以在其中键入-fobjc-arc,并将其添加到所有文件中。

我需要以编程方式启用-fobjc-arc,因为有多个文件在多个Xcode项目中。我想在不打开XCode的情况下实现这一点。如果可能的话,使用perl(因为它正在使用perl脚本从远程服务器生成xcode)。 - Edwin Abraham
为什么需要编程呢?如果只需要做一次,为什么不直接做呢?似乎你还需要特别选择哪些文件需要启用它,所以尝试用你的方式做可能需要同样或更多的工作量,与使用Xcode做相比。此外,使用脚本修改文件时,如果你不完全了解文件格式,就有破坏文件的风险。 - Gavin
这是真的,通过Xcode进行操作更加安全。但是,使用project.pbxproj编程可以在不打开Xcode的情况下修改构建阶段。由于文件引用是与Xcode项目创建同时生成的,因此破坏文件的问题将大大减少。然而,事实上苹果没有官方指南来编辑project.pbxproj。 - Edwin Abraham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接