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

     2023-02-24     139

关键词:

【中文标题】如何以编程方式为非 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。

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

】如何在xcode5iOS7中以编程方式编辑plist?【英文标题】:howtoeditaplistprogrammaticallyinxcode5iOS7?【发布时间】:2014-04-0823:06:04【问题描述】:如何编辑或更改值字符串:在这个plist中,我需要在第2项的启用值中更改或设置“否”,我... 查看详情

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

】如何以编程方式在Xcode中的视图控制器之间移动用户?【英文标题】:HowcanIprogramaticallymoveusersbetweenViewControllersinXcode?【发布时间】:2021-02-2616:10:08【问题描述】:一旦用户登录到我的应用程序,下面的函数会自动将用户重定向... 查看详情

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

】如何使用Swift以编程方式创建UILabel?【英文标题】:HowtocreateUILabelprogrammaticallyusingSwift?【发布时间】:2014-07-2717:13:56【问题描述】:如何在Xcode6中使用Swift以编程方式创建UILabel?我从Xcode6中的一个新的“单一视图应用程序”开... 查看详情

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

】以编程方式从ARC中的导航堆栈中删除viewController【英文标题】:RemovingtheviewControllerprogrammaticallyfromthenavigationstackinARC【发布时间】:2012-12-0411:16:52【问题描述】:我想在推送第三个新的ViewController之前清除我的导航堆栈,它有两... 查看详情

在 iOS 中以编程方式生成视图

】在iOS中以编程方式生成视图【英文标题】:GeneratingaviewprogrammaticallyiniOS【发布时间】:2012-09-1015:19:24【问题描述】:更新:感谢大家的所有提示。该教程提到提供了一个XIB文件(我没有),所以我在创建项目的方式上做错了。... 查看详情

如何在没有 XIB 文件的情况下以编程方式更新 Xcode 中的 UILabel?

】如何在没有XIB文件的情况下以编程方式更新Xcode中的UILabel?【英文标题】:HowtoupdateaUILabelinXcodeprogrammaticallywithoutXIBfiles?【发布时间】:2011-07-2909:40:07【问题描述】:我被困住了:(在我的应用程序中,每次更新到新位置时,我都... 查看详情

如何以编程方式更改标签栏项目使用的默认图标?

】如何以编程方式更改标签栏项目使用的默认图标?【英文标题】:Howtoprogrammaticallychangethedefaulticonusedbyatabbaritem?【发布时间】:2020-03-0204:25:13【问题描述】:我有一个TabBar项目,它是一个名为“购物车”的购物车大纲。这是XCod... 查看详情

在 Xcode 项目中组织文件并以编程方式获取文件夹列表

】在Xcode项目中组织文件并以编程方式获取文件夹列表【英文标题】:OrganizefilesinXcodeprojectandgetthelistoffoldersprogrammatically【发布时间】:2015-04-2717:25:10【问题描述】:我在资源导航器中的Xcode项目中有以下结构,我想在我的应用程... 查看详情

如何以编程方式选择collectionview中的项目?

】如何以编程方式选择collectionview中的项目?【英文标题】:Howtoselectitemincollectionviewprogrammatically?【发布时间】:2014-02-0723:05:06【问题描述】:我有一个UICollectionView。UICollectionView的datasource是学生的NSArray(来自CoreData)。我希望... 查看详情

如何以编程方式选择 ListView 中的项目?

】如何以编程方式选择ListView中的项目?【英文标题】:HowtoselectaniteminaListViewprogrammatically?【发布时间】:2011-08-1301:41:46【问题描述】:我正在尝试以编程方式选择ListView中的第一项,但它似乎没有被选中。我正在使用以下代码... 查看详情

如何以编程方式选择 WPF TreeView 中的项目?

】如何以编程方式选择WPFTreeView中的项目?【英文标题】:HowtoprogrammaticallyselectaniteminaWPFTreeView?【发布时间】:2010-09-2915:47:27【问题描述】:如何以编程方式选择WPFTreeView中的项目?ItemsControl模型似乎可以阻止它。【问题讨论】... 查看详情

xcode/ios:以编程方式启动模态视图控制器时如何传递数据

】xcode/ios:以编程方式启动模态视图控制器时如何传递数据【英文标题】:xcode/ios:Howtopassdatawhenprogrammaticallylaunchingmodalviewcontroller【发布时间】:2015-04-0614:48:07【问题描述】:您好,我正在使用以下代码以编程方式启动一个存在... 查看详情

如何以编程方式更改 iOS 中的视图

】如何以编程方式更改iOS中的视图【英文标题】:HowtoprogramaticallychangeviewsiniOS【发布时间】:2013-01-1904:34:57【问题描述】:在Xcode4.5中,您可以从segue更改视图,但我想以编程方式更改Mainstoryboard中的视图。我知道在Xib。我们使用... 查看详情

如何以编程方式列出解决方案中的所有项目?

】如何以编程方式列出解决方案中的所有项目?【英文标题】:HowdoIprogrammaticallylistallprojectsinasolution?【发布时间】:2011-04-1715:39:06【问题描述】:我将接受脚本、命令行或API调用。【问题讨论】:【参考方案1】:只需从*.sln文... 查看详情

如何以编程方式选择数据绑定 ListBox 控件中的项目

】如何以编程方式选择数据绑定ListBox控件中的项目【英文标题】:HowtoprogramaticallyselectaniteminadataboundListBoxcontrol【发布时间】:2012-01-0200:02:46【问题描述】:我有一个自定义样式的列表框:<phone:PhoneApplicationPage.Resources><Styl... 查看详情

X 位置约束未以编程方式更新 - Xcode 中的 Swift

】X位置约束未以编程方式更新-Xcode中的Swift【英文标题】:XPositionConstraintNotUpdatingProgrammatically-SwiftinXcode【发布时间】:2016-05-1516:28:54【问题描述】:我以编程方式在设置为IBOutlet的UISwitch上设置了以下约束:funcsetConstraintsletleadin... 查看详情

如何向在 tabcontroller 中以编程方式创建的导航控制器中的 barbuttonitem 添加操作

】如何向在tabcontroller中以编程方式创建的导航控制器中的barbuttonitem添加操作【英文标题】:Howtoaddactiontoabarbuttoniteminanavcontrollerthatwascreatedprogrammaticallywithintabcontroller【发布时间】:2013-02-2620:50:23【问题描述】:我尝试将barbuttonit... 查看详情

如何以编程方式获取 Xcode 显示的线程名称

】如何以编程方式获取Xcode显示的线程名称【英文标题】:HowtoGetXcode\'sDisplayedThreadNameProgrammatically【发布时间】:2021-03-1619:01:34【问题描述】:如果应用程序没有特别重命名线程,Xcode调试器会显示名称如“线程N”的线程。如何... 查看详情