如何以编程方式为非 ARC xcode 项目中的特定文件启用 ARC?

Posted

技术标签:

【中文标题】如何以编程方式为非 ARC xcode 项目中的特定文件启用 ARC?【英文标题】:How to enable ARC programmatically for specific files in a non-ARC xcode project? 【发布时间】:2014-01-09 15:02:47 【问题描述】:

我有一种情况,我需要在几个非 ARC xcode 项目中为许多文件启用 ARC。我不希望完全转换为 ARC,只需要使用 arc 启用少数文件。

有许多解决方案包括 -fobjc-arc 标志到使用 XCode 控制台编译源中的特定文件。但是我在多个 xcode 项目中有太多文件,无法通过 XCode 单独更改它。

有没有一种方法可以让我以编程方式修改构建阶段设置。 我发现很少有类似

的帖子 Tutorial or Guide for Scripting XCode Build Phases Per-file compiler flags in Xcode project template

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

project.pbxproj 代码的操作似乎是最可能的选择。但我不知道该怎么做。

【问题讨论】:

您可以一次全部更改。 ***.com/questions/13088005/… 你在 xcode 菜单 Edit->Refactor>Convert to Objective-C ARC 中试过了吗! 这是一个非 ARC 项目,其中很少有启用 ARC 的文件。我将更改描述以提及这一点。 【参考方案1】:

如果您查看 .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 的引用也应该出现。那只是三倍。不知道你是怎么弄到四个的。也必须适用于所有文件引用。 这周我遇到了 mod_pbxproj。有关更多信息,请参阅我的答案。【参考方案2】:

如果您想将默认目标保留为非 ARC,那么您有两种选择:

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

【讨论】:

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

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

【讨论】:

我需要以编程方式启用 -fobjc-arc,因为多个 xcode 项目中有多个文件。在不打开 XCode 的情况下,我想实现这一点。如果可能的话,使用 perl(因为它使用 perl 脚本从远程服务器生成 xcode)。 为什么需要编程方式?如果这只需要做一次,为什么不直接做呢?似乎您无论如何都必须专门选择哪些文件需要启用它,因此尝试以您的方式执行它似乎与使用 Xcode 执行它一样多或更多的工作。此外,如果您不完全了解文件格式,则使用脚本可能会破坏您正在修改的文件。 确实,通过 Xcode 进行操作更安全。但是 project.pbxproj 编程会在不打开 xcode 的情况下修改构建阶段。由于文件引用是与 xcode 项目创建一起生成的,因此破坏文件的问题将大大减少。然而,确实没有官方的苹果指南来编辑 project.pbxproj。

以上是关于如何以编程方式为非 ARC xcode 项目中的特定文件启用 ARC?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 xcode 5 iOS 7 中以编程方式编辑 plist?

如何以编程方式更改 XCode 项目的设备目标?

以编程方式从 ARC 中的导航堆栈中删除 viewController

如何以编程方式将组件分配给 Delphi GridPanel 行和列?

如何使用 Swift 以编程方式创建 UILabel?

如何以编程方式在 Xcode 中的视图控制器之间移动用户?