为什么ARC仅适用于iOS 4.0及以上版本?

9
iOS 4.0及以上版本支持ARC的技术原因是什么?
据我了解,这是一种编译器功能,它自动插入与内存管理相关的代码,而无需开发人员手动执行。从我阅读的内容来看,调用本身保持不变-至少苹果公司的过渡到ARC指南是这样暗示的。
因此,它不应涉及之前版本的iOS中不存在的功能,实际上ARC确实可以在iOS 4.0上工作,尽管稍后才被引入。
我出于好奇才提出这个问题,实际上并不需要使ARC与iOS 3.x兼容。
4个回答

16
出于同样的原因,自动引用计数仅支持64位Snow Leopard作为最小部署目标:ARC支持需要现代运行时的足够新的版本才能提供某些功能。该现代运行时是在iOS 4.0中引入的,因此旧版iOS缺少处理ARC所需技术上的一些东西的运行时。如果只是按照操作系统版本来区分,那么32位Snow Leopard应用程序也将得到支持,但只有64位运行时是现代化的。
如果您观看WWDC 2011的Apple演示,特别是“Objective-C Advancements In-Depth”,您会发现已经进行了许多底层改进以加快保留/释放过程,以及像更快的@autoreleasepool之类的东西。 LLVM ARC specification中有一个关于运行时支持的完整部分。这些改进需要不止编译器支持。
我们已经不得不使用现代运行时来实现自动合成实例变量等功能(如苹果的文档所述),因此这并不是一个可怕的惊喜。
即使 iOS 4.0 作为目标,也缺乏对弱引用的支持,因此在这里显然存在技术问题。这不仅仅是其他人所断言的一种推动开发者转向新版本的营销策略。

1
ARC 不太可能需要 x86-64 上具备而 i386 上缺失的某些功能以阻止其实现。"技术"、"营销"、"资源"、"管理"、"实际"等都是主观的术语。除非有来自苹果公司的人选择参与,否则对 OP 的问题的所有答案最多只能是猜测。实际上,苹果公司的不同人员可能有不同的原因,这取决于他们的角色!这没有什么"明显"的 - 请注意其他答案中使用了"可能"和"猜测"。 - CRD
4
或许你应该阅读上面的苹果文档,其中写道:“iPhone应用程序和Mac OS X v10.5及更高版本上的64位程序使用现代版本的运行时。其他程序(Mac OS X桌面上的32位程序)使用旧版运行时。”这不是关于x86-64 vs. i386,而是与运行时功能有关。正如我所提到的,每个操作系统随附的运行时版本之间存在技术差异,并且需要足够新的运行时版本才能支持ARC。将较新版本的运行时向老的操作系统版本回溯是不可行的。 - Brad Larson
除了ARC不能在使用现代运行时的10.5上运行之外...为什么现代运行时不能在i386上运行...等等。我们最终会争论图灵完备性 :-) - CRD
这就是我所期望的答案。非常感谢您,先生! - Toastor
Brad,恭喜你得到了那颗小钻石!你应该戴上它的 ;) - Toastor

4

苹果文档指出,在ARC情况下,dealloc链接到super是在运行时处理的。


2
同一个问题的形式可能是:
为什么只有iOS 4.0+和Mac OS X 10.7(Lion)以上版本支持NSRegularExpression
在Mac OS X 10.6.7(Snow Leopard)中,您可以使用完全可用的iOS 5.0模拟器(以及显然的4.0),但是它本身不支持NSRegularExpression
至于您的问题:ARC是在iOS 5.0推出的。当时已经没有太多的iOS 3.x用户了,所以我的看法是苹果公司有点懒得让ARC与iOS 3.x兼容。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接