ChatGPT解决这个技术问题 Extra ChatGPT

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

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

如果我决定升级到 iOS 5,是否需要从我的代码中删除所有 [myObject retain] 和 [myObject release] 语句?如果我使用 ARC 为 iOS 5 开发新应用程序,我是否需要实施某种“复古兼容性”检查?即:我需要检查iOS的版本并相应地调用retain和release吗?那么,基本上,ARC 是适用于所有 iOS 版本还是仅适用于 iOS 5?


J
Josh Brown

如果我决定升级到 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


谢谢你的解释!
这不是 100% 正确的。有一个编译器开关决定是否启用 ARC。我相信 ARC 还需要一些运行时支持,所以如果您希望您的应用程序在 iOS 4.x 上运行,您需要保留您的保留和发布,并确保 ARC 已关闭。
@JeremyP - iOS 4.0 确实被支持作为 ARC 应用程序的目标,因此无需保留手动引用计数代码来解决旧平台的问题。也许是 iPhone OS 3.x,但我想 Apple 可能会在 5.0 发布后停止对它作为目标平台的支持,就像他们在 4.0 发布时对 2.x 所做的那样。
@Brad iOS4 的安装基数已经超过 95%。我认为无论如何放弃对iOS3的支持是有好处的。
您没有删除 dealloc,您只是从中删除了所有 release[super dealloc]。并且在 99.9% dealloc 中只是释放对象,因此您将其删除。但是对象仍然必须执行不是 release 的其他清理任务(关闭文件、删除观察者等)。
T
Tibidabo

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

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

在 Xcode PRESS ENTER 中的 Target/Build Phases/Compile Sources 中选择所需的文件。 (双击只选择一个文件) 输入 -fno-objc-arc 按 Enter 或 Done

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


D
Dylan Gattey

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


最新的 beta 版本实际上提示我删除所有分配调用,仅此而已。您仍然可以保留/释放,但系统有最终决定权。
C
Community

关于你问题的这一部分

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

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


o
oliver

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