关于iOS5 SDK中自动引用计数的一些问题

时间:2011-06-16 07:41:14

标签: objective-c ios5 automatic-ref-counting xcode4.2

我目前正在为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?

5 个答案:

答案 0 :(得分: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   编译器标志。支持ARC   适用于Mac OS X v10.6和v10.7的Xcode 4.2   (64位应用程序)和iOS 4   和iOS 5.(弱引用不是   在Mac OS X v10.6和iOS中受支持   4)。 Xcode中没有ARC支持   4.1。

-

  

如果我使用iOS 5开发新的应用程序   ARC,我需要实现一些   那种“复古兼容性”检查?   即:我需要检查版本   iOS和调用保留和释放   因此?所以,基本上就是ARC   适用于所有iOS版本或仅适用于   对于iOS 5?

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

  

而不是你必须记住什么时候   使用保留,释放和   自动释放,ARC评估   对象的生命周期要求   并自动插入   适当的方法要求你   编译时间。编译器也   生成适当的dealloc方法   对你而言。

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

答案 1 :(得分:8)

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

如果您想在 MULTIPLE 文件停用ARC

  1. 在Xcode
  2. 中的目标/构建阶段/编译源中选择所需文件
  3. 按ENTER 。 (双击只选择一个文件)
  4. 输入 -fno-objc-arc
  5. Enter 完成
  6. Q2:不,目标可以和iOS 4.0一样低

答案 2 :(得分:7)

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

答案 3 :(得分:5)

关于你问题的这一部分

  

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

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

答案 4 :(得分:2)

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