135

我目前正在为 iPad 开发一个应用程序。开发从 iOS 4.2 开始,现在正在继续(我认为将会完成)iOS 4.3。我刚刚阅读了 iOS 5 中的 ARC,基本上我明白我们将不再需要释放和保留对象了。我的问题是:

  1. 如果我决定升级到 iOS 5,是否需要从我的代码中删除所有[myObject retain][myObject release]语句?

  2. 如果我使用 ARC 为 iOS 5 开发新应用程序,我是否需要实施某种“复古兼容性”检查?即:我需要检查iOS的版本并相应地调用retain和release吗?那么,基本上,ARC 是适用于所有 iOS 版本还是仅适用于 iOS 5?

4

5 回答 5

150

如果我决定升级到 iOS 5,是否需要从我的代码中删除所有 [myObject retain] 和 [myObject release] 语句?

是的,但是 XCode 4.2 包含一个新的“迁移到 Objective-C ARC”工具(在 Edit->Refactor 菜单中),它可以为您完成这项工作。调用 dealloc 是另一回事。正如评论中提到的,clang 参考声明你应该保留你的 dealloc 方法:

理由:即使 ARC 自动销毁实例变量,仍然有正当理由编写 dealloc 方法,例如释放不可保留的资源。在这种方法中未能调用 [super dealloc] 几乎总是一个错误。

您可以使用新的 -fobjc-arc 编译器标志启用 ARC。Xcode 4.2 支持 Mac OS X v10.6 和 v10.7(64 位应用程序)以及 iOS 4 和 iOS 5。(Mac OS X v10.6 和 iOS 4 不支持弱引用)。Xcode 4.1 中没有 ARC 支持。

-

如果我使用 ARC 为 iOS 5 开发新应用程序,我是否需要实施某种“复古兼容性”检查?即:我需要检查iOS的版本并相应地调用retain和release吗?那么,基本上,ARC 是适用于所有 iOS 版本还是仅适用于 iOS 5?

不,因为 ARC 在编译时而不是在运行时发挥其魔力。

您不必记住何时使用保留、释放和自动释放,ARC 会评估对象的生命周期要求并在编译时自动为您插入适当的方法调用。编译器还会为您生成适当的 dealloc 方法。

关于 ARC 的更多信息:http: //clang.llvm.org/docs/AutomaticReferenceCounting.html

于 2011-06-16T07:51:27.747 回答
8

Q1:不,如果您有现有代码,您可以继续使用它,使用-fno-objc-arc您可以选择性地禁用任何文件上的 ARC。

如果要在多个文件上禁用 ARC :

  1. 在 Xcode 中的 Target/Build Phases/Compile Sources 中选择所需的文件
  2. 按回车。(双击只选择一个文件)
  3. 类型-fno-objc-arc
  4. Enter完成

Q2:否,目标可以低至 iOS 4.0

于 2012-05-02T07:50:19.177 回答
6

据我了解,就我的 iPhone/iPod 分别运行 iOS 5 和 iOS 4.3 而言,这一切都是自动的。我从 4.0 开始并已“更新”以与 Xcode for iOS 5.0 一起使用的应用程序永远不会对我的释放和保留方式发出任何警告,即使它遍布每个 dealloc 等。但是,我插入的一些相同代码(复制文件)到使用 Xcode for iOS 5创建的新项目中有很多警告。因此,您似乎不必删除所有这些调用,不,它会以某种方式自动适应旧版本。分析我的 iPod,我没有看到内存泄漏或其他释放失败/释放失败的迹象。这有帮助吗?

于 2011-06-16T07:47:46.713 回答
5

关于你问题的这一部分

如果我使用 ARC 为 iOS 5 开发新应用程序,我是否需要实施某种“复古兼容性”检查?即:我需要检查iOS的版本并相应地调用retain和release吗?那么,基本上,ARC 是适用于所有 iOS 版本还是仅适用于 iOS 5?

应该注意的是,iOS 5 编译器采用了“复古兼容性”(它实际上添加了代码以使保留/释放工作,本质上),但如果您不是为 iOS 5.0 编译,则不能weak用作关键字. 相反,您使用assign. 这是不幸的:这weak是一个巨大的优势(永远没有悬空指针!)。有关和 ARC的讨论,请参见我的问题weakassign

于 2011-10-12T12:56:29.140 回答
2

如果您可以通过不使用新的 -fobjc-arc 编译器标志来禁用 ARC,那么您不会被迫重新编写代码 - 我猜(?)

于 2011-11-07T09:47:19.230 回答