【问题标题】:ARC conversion tool issues: flagged retain/release, and random parse errorsARC 转换工具问题:标记的保留/释放和随机解析错误
【发布时间】:2012-10-08 06:27:25
【问题描述】:

我正在重新访问一个较旧的项目并转换为 ARC,这是我第一次通过 Xcode 的转换工具 (Edit -> Refactor -> Convert to Objective-C ARC...),我看到一些我不确定是真正的问题还是以某种方式转移注意力的事情.

正如预期的那样,我得到了一个工具发现的阻止它完成的事情的大列表,但是:

  1. 许多(全部?)保留/释放/自动释放实例似乎被标记为错误,例如“发布不可用:在自动引用计数模式下不可用”。我真的应该自己摆脱所有这些吗?我认为这就是该工具的作用。

  2. 在我的许多课程中,我看到一堆看起来像幻像解析/构建错误的错误,这些错误与 ARC 无关。例如。在一个显然没有 ARC 相关问题的简单类中,我将在一些任意方法实现上得到一个“未声明的标识符”,然后在文件末尾出现一堆“解析错误:预期 }”,等等。这些不是真实的 - 项目构建良好,我没有看到任何错误的直接原因或解决方案。

列表中也存在“真正的”问题(需要在代码中明确阐明的预期桥接问题),但上述各种随机错误如此之多,以至于很难在噪声中找到信号。这对我来说似乎是错误的。

我是否误解了这个工具的真正作用? Apple 的文档是这样说的:

Xcode 提供了一个自动化 ARC 机械部分的工具 转换(例如删除保留和释放调用)并帮助您 解决迁移器无法自动处理的问题

谢谢。

【问题讨论】:

    标签: ios xcode automatic-ref-counting


    【解决方案1】:
    1. 该工具不会为您摆脱它们,而只是在编译时根据需要添加保留/释放代码。
    2. 当您摆脱旧的引用计数代码时,这些问题很可能会消失。

    编辑:进一步解释:

    在 Xcode 4.2 中,除了在您键入时进行语法检查之外,新的 Apple LLVM 编译器可以减轻手动操作的负担 内存管理到编译器,内省你的代码来决定 何时释放对象。 Apple 的文档将 ARC 描述为 如下:

    “自动引用计数 (ARC) 是编译器级别的功能, 简化了管理对象生命周期(内存 管理)在 Cocoa 应用程序中。”

    换句话说,ARC 不会从您的代码中“剥离”引用计数,而是在后台自行执行。您不再需要再次输入releaseretaindealloc。 ARC 需要工作的一件事是它自己完全进行引用计数(没有用户引用计数“妨碍”)。

    【讨论】:

    • 那么,如果不去除无关调用,那么该工具究竟做了什么?关于#2,这是否意味着我应该在进行转换时忽略这些错误?
    • 用进一步的解释更新了我的答案。
    • 这描述了 ARC 本身在运行时是如何工作的。我正在寻找有关 Xcode 中 ARC 重构/转换工具的工作原理及其输出含义的信息。
    • 转换工具不会(我上次使用它)从您的项目中删除任何代码,而是简单地启用更新的、支持 ARC 的编译器。您必须自行删除旧的引用计数代码。
    • 迁移工具绝对从您的代码中删除发布/保留。
    【解决方案2】:

    花了很长时间才解决,但这两个问题似乎都源于我使用的一些自定义宏。我有一个经常使用的 release-and-set-to-nil 宏,如下所示:

    #define RELEASENIL(x)   [(x) release]; \
                            (x) = nil;
    

    我仍然不知道为什么,但由于某种原因,ARC 转换工具并没有从容应对这一点,而是卡住了它,抛出了发布警告和解析错误。 (与预处理器的一些交互?)当我更改宏以删除发布行时,转换过程更符合我的预期。

    是的,它当然会为您删除消息。 (如果其他人遇到此问题,我会回答我自己的问题。)

    【讨论】:

      猜你喜欢
      • 2011-12-13
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      • 2012-12-06
      • 1970-01-01
      • 2011-12-14
      相关资源
      最近更新 更多