Ios ARC转换工具问题:标记保留/释放和随机分析错误

Ios ARC转换工具问题:标记保留/释放和随机分析错误,ios,xcode,automatic-ref-counting,Ios,Xcode,Automatic Ref Counting,我第一次通过Xcode的转换工具(Edit->Refactor->Convert to Objective-C ARC…)重新访问一个较老的项目并转换为ARC,我看到了一些我不确定的事情,它们是真的问题还是有点麻烦 正如预期的那样,我得到了一大串工具发现的阻止它完成的事情,但是: 许多(全部?)保留/释放/自动释放实例似乎被标记为错误,例如“释放不可用:在自动引用计数模式下不可用”。我真的应该自己把这些都处理掉吗?我想这就是工具的作用 在我的许多类中,我看到了一系列错误,这些错误看起来像幻影解析

我第一次通过Xcode的转换工具(
Edit->Refactor->Convert to Objective-C ARC…
)重新访问一个较老的项目并转换为ARC,我看到了一些我不确定的事情,它们是真的问题还是有点麻烦

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

  • 许多(全部?)保留/释放/自动释放实例似乎被标记为错误,例如“释放不可用:在自动引用计数模式下不可用”。我真的应该自己把这些都处理掉吗?我想这就是工具的作用

  • 在我的许多类中,我看到了一系列错误,这些错误看起来像幻影解析/构建错误,与ARC无关。例如,在一个显然没有ARC相关问题的简单类中,我会在一些任意方法实现上得到一个“未声明的标识符”,然后在文件末尾得到一堆“Parse error:expected}”,等等。这些都不是真实的——项目构建得很好,我看不到错误的任何直接原因或解决方法

  • 列表中也有“真正的”问题(需要在代码中明确说明的预期桥接问题),但上述各种随机错误太多,以至于在噪声中很难找到信号。我觉得这是不对的

    我是否误解了此工具的真正用途?苹果的文档说:

    Xcode提供了一个工具,可以自动控制电弧的机械部分 转换(如删除保留和释放呼叫)并帮助您 要解决迁移器无法自动处理的问题

    谢谢

  • 该工具不会为您消除它们,只是在编译时根据需要添加保留/发布代码
  • 当您摆脱旧的引用计数代码时,这些问题很可能会消失
  • 编辑:进一步解释:

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

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


    换句话说,ARC不会从代码中“剥离”引用计数,而是在引擎盖下自己进行。您不再需要再次键入
    release
    retain
    dealloc
    。ARC需要做的一件事是完全独立地进行引用计数(没有用户引用计数来“碍事”)。

    花了很长时间来解决,但这两个问题似乎都源于我使用的一些自定义宏。我有一个用于发布的宏,设置为nil,我经常使用它,如下所示:

    #define RELEASENIL(x)   [(x) release]; \
                            (x) = nil;
    
    我仍然不知道为什么,但出于某种原因,ARC转换工具没有大踏步地处理这个问题,并且被它卡住了,抛出了发布警告和解析错误。(与预处理器进行了一些交互?)当我更改宏以删除发布行时,转换过程更加符合我的预期


    是的,它当然会为您删除消息。(我在回答我自己的问题,希望其他人不会有这个问题。)

    那么,如果不排除无关调用,该工具实际上做了什么?Re#2,这是否意味着在进行转换时我应该忽略这些错误?更新了我的答案并作了进一步解释。这描述了ARC本身在运行时的工作方式。我正在寻找有关Xcode中ARC重构/转换工具的工作原理及其输出含义的信息。转换工具(上次我使用它时)不会从项目中删除任何代码,而只是启用更新的、启用ARC的编译器。您必须自己删除旧的引用计数代码。迁移工具绝对会从代码中删除release/retain。