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

Luk*_*e47 134 objective-c ios5 xcode4.2 automatic-ref-counting

我正在开发一款适用于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?

Hen*_*sel 150

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

是的,但是XCode 4.2包含一个新的"迁移到Objective-C ARC"工具(在Edit-> Refactor菜单中),它可以为您完成.调用dealloc是一个不同的故事.正如评论中所提到的,clang引用声明你应该保留dealloc方法:

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

使用新的-fobjc-arc编译器标志启用ARC.适用于Mac OS X v10.6和v10.7(64位应用程序)以及iOS 4和iOS 5的Xcode 4.2支持ARC.(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

  • @JeremyP - 确实支持iOS 4.0作为ARC应用程序的目标,因此无需保留手动引用计数代码来解决旧版平台问题.也许是iPhone OS 3.x,但我想苹果可能会停止支持这个作为目标平台的5.0一样,就像4.0版本出来时那样. (8认同)
  • @Brad iOS4的安装基础已经超过95%.我认为无论如何都要放弃iOS3支持. (5认同)
  • 这不是100%正确.有一个编译器开关确定是否启用ARC.另外,ARC需要一些运行时支持,所以如果你想让你的应用程序在iOS 4.x上运行,你需要保留你的保留和发布,并确保关闭ARC. (4认同)
  • 你不删除`dealloc`,你只需删除所有`release`s和`[super dealloc]`.并且在99.9%`dealloc`中只释放对象,因此您将其删除.但是对象仍然必须执行其他清理任务,这些任务不是"释放"(关闭文件,删除观察者等). (2认同)

Tib*_*abo 8

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

如果要在MULTIPLE文件上禁用ARC:

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

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


Dyl*_*tey 7

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


Dan*_*ark 5

关于你的这部分问题

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

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