【问题标题】:Transitioning one separate file to arc将一个单独的文件转换为 arc
【发布时间】:2013-04-10 10:02:38
【问题描述】:

我有一个项目已经过渡到ARC。现在我正在尝试包含来自另一个项目的现有文件,该文件没有使用 ARC,我希望它也符合 ARC:release-retains,[super dealloc]s 从这个文件中消失,快速修复,其他东西“转换为 Objective-C ARC ...”可以。

问题是我不能为此使用Edit->Refactor->"Convert to Objective-C ARC..." 工具。如果我在“选择要转换的目标”屏幕中仅选择此文件,我将收到“无法转换为 Objective-C ARC”消息,因为错误如下:"@synthesize of 'weak' 属性仅在 ARC 或 GC 模式下允许”。但它们是确实已经处于 ARC 模式!还有许多警告:“方法可能缺少[super dealloc] 调用”

如果我在转换时选择了除标有 -fno-objc-arc 之外的所有文件,我只会收到有关弱属性的错误。

当然,我可以手动构建和删除发布保留,但是如果有公共汽车(转换工具)为什么要走路...那么我可以将单独的文件自动转换到 ARC 吗?

更新:我不想为这个带有 -fno-objc-arc 标志的文件关闭 ARC,我希望在这个文件中使用 ARC。

【问题讨论】:

  • @Attila H 我不想为这个文件禁用 ARC,我想要释放保留,[super dealloc] 自动从这个文件中消失,因为它发生在你使用“无法转换为 Objective-C弧”工具。抱歉,如果我的问题不清楚。

标签: ios objective-c automatic-ref-counting


【解决方案1】:

如果您坚持让 Xcode 完成这项工作,请创建一个新的 Xcode 项目并在创建时取消选择“使用 ARC”。添加要转换的文件,并将项目转换为 ARC。获取修改后的文件并将它们导入到您的其他项目中。

但是,手动转换文件可能更简单。这并不困难,即使对于大文件或整个项目也是如此。只需依靠编译器:构建您的应用程序,检查错误并简单地删除所有保留/释放调用并将任何NSAutoreleasePools 转换为@autoreleasepool {}。如果与核心基础类型交互,您可能还需要添加 __bridge casts。

【讨论】:

  • 宾果游戏!那成功了!顺便说一句,在这个线程中的第一个答案之后,我通过编译器错误手动修改了文件:删除保留,释放,[super dealloc]。并且转换工具比我多做了 2 处更改:将其中一个属性的分配修改为弱;将变量的 __block 修改为 __weak。由于这段代码不是我的,而且我没有进行太多调查,所以我从未见过那些地方。似乎这些变化与以前的效果相似,但我认为它现在更干净了。感谢您的回答!
【解决方案2】:

听起来您必须手动将此文件转换为 ARC,而不是依赖自动转换工具。您需要浏览文件并删除所有发布、保留等内容。我以前做过,虽然需要一段时间,但不会太痛苦。依靠来自 Xcode 的错误消息来指导您在代码中需要修复/删除的内容。 这是我发现可能有帮助的几个链接。另请查看 Apple 的 ARC 文档和 WWDC 2011 演讲(在第二个链接底部引用)。

Xcode ARC conversion tool issue

http://blog.mugunthkumar.com/articles/migrating-your-code-to-objective-c-arc/

【讨论】:

  • 同意。即使对于大文件或整个项目,手动转换为 ARC 也不难。只需依靠编译器:构建您的应用程序,检查错误并简单地删除所有保留/释放调用并将任何NSAutoreleasePools 转换为@autoreleasepool {}。如果与核心基础类型交互,您可能还需要添加 __bridge casts。
  • @stevekohls 原来自动工具比我发现的更多。请参阅我对Mike Weller's answer的评论
猜你喜欢
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
  • 2017-07-28
相关资源
最近更新 更多