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


134

我目前正在开发iPad版应用程序。该开发工作始于iOS 4.2,现在正在继续(并且我认为将完成)针对iOS 4.3。我刚刚阅读了iOS 5中的ARC,并且基本上我了解到我们将不再需要释放和保留对象。我的问题是:

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

  2. 如果我使用ARC开发了适用于iOS 5的新应用,是否需要实施某种“复古兼容性”检查?即:我需要检查iOS版本并相应地调用“保留并释放”吗?因此,基本上,ARC是否适用于所有iOS版本或仅适用于iOS 5?

Answers:


150

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

是的,但是XCode 4.2包括一个新的“迁移到Objective-C ARC”工具(在“编辑”->“重构”菜单中),该工具可以为您完成此工作。调用dealloc是另一回事。如注释中所述,clang参考说明您应保留dealloc方法:

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

您可以使用新的-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版本并相应地调用“保留并释放”吗?因此,基本上,ARC是否适用于所有iOS版本或仅适用于iOS 5?

不可以,因为ARC是在编译时而不是运行时发挥作用的。

ARC无需评估何时使用保留,释放和自动释放功能,而是可以评估对象的生存期要求,并在编译时自动为您插入适当的方法调用。编译器还会为您生成适当的dealloc方法。

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


谢谢你的解释!
Luke47 2011年

4
这不是100%正确的。有一个用于确定是否启用ARC的编译器开关。我相信ARC也需要一些运行时支持,因此,如果您希望您的应用程序在iOS 4.x上运行,则需要保留和发布文件,并确保ARC已关闭。
JeremyP 2011年

8
@JeremyP-确实支持将iOS 4.0作为ARC应用程序的目标,因此无需保留手动引用计数代码即可解决该较旧的平台。也许是iPhone OS 3.x,但我想苹果公司可能会在5.0发行后不再支持它作为目标平台,就像4.0发行时对2.x一样。
布拉德·拉尔森

5
@Brad iOS4的安装基数已超过95%。我认为保留iOS3支持仍然是省钱的。
Henrik P. Hessel

2
您不删除dealloc,只需删除所有,release然后[super dealloc]从中删除所有。99.9%的dealloc对象只是释放对象,因此将其删除。但是对象仍然必须执行其他清理任务release(关闭文件,删除观察者等)。
斯坦尼斯拉夫·亚格罗

8

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

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

  1. 在Xcode的目标/构建阶段/编译源中选择所需的文件
  2. 按ENTER。(双击仅选择一个文件)
  3. 类型 -fno-objc-arc
  4. Enter完成

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


7

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


实际上,最新的beta版本提示我删除所有分配调用,仅此而已。您仍然可以保留/释放,但系统保留最后的权利。
Dylan Gattey 2011年

5

关于这部分问题

如果我使用ARC开发了适用于iOS 5的新应用,是否需要实施某种“复古兼容性”检查?即:我需要检查iOS版本并相应地调用“保留并释放”吗?因此,基本上,ARC是否适用于所有iOS版本或仅适用于iOS 5?

应当注意,iOS 5编译器采用了“复古兼容性”(实际上,它实际上是添加代码以使保留/释放工作),但是如果您不针对iOS 5.0进行编译,则不能将其weak用作关键字。相反,您使用assign。这是不幸的:这是weak一个巨大的优势(永远不会晃来晃去的指针!)。见我的问题在这里进行的讨论weakassign和ARC。


2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.