1

Edit -> Refactor -> Convert to Objective-C ARC...我正在重新访问一个较旧的项目并转换为 ARC,这是我第一次通过 Xcode 的转换工具 (

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

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

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

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

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

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

谢谢。

4

2 回答 2

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

编辑:进一步解释:

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

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

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

于 2012-10-08T06:30:18.270 回答
0

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

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

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

是的,它当然会为您删除消息。(我正在回答我自己的问题,以防其他人遇到这个问题。)

于 2012-10-11T15:38:25.507 回答