【问题标题】:Why does ARC work for iOS 4.0+ only?为什么 ARC 仅适用于 iOS 4.0+?
【发布时间】:2012-03-23 19:09:48
【问题描述】:

ARC 仅受 iOS 4.0 及更高版本支持的技术原因是什么?

据我了解,这是一个编译器功能,它只是自动插入内存管理相关的代码,而不需要开发人员这样做。从我读到的电话本身保持不变 - 至少这是 Apples Transitioning to ARC Guide 所暗示的。

因此,它不应该涉及以前版本的 iOS 中没有的功能,尽管 ARC 是后来引入的,但确实适用于 iOS 4.0。

我是出于好奇而问这个问题,实际上并不需要让 ARC 与 iOS 3.x 一起工作。

【问题讨论】:

    标签: objective-c ios memory-management automatic-ref-counting


    【解决方案1】:

    出于同样的原因,自动引用计数仅支持 64 位 Snow Leopard 作为最低部署目标:ARC 支持要求某些功能仅存在于足够新的现代运行时版本中。现代运行时是在 iOS 4.0 中引入的,因此较旧的 iOS 版本缺乏能够处理 ARC 在技术上所需的一些事情的运行时。如果它只是针对操作系统版本,32 位雪豹应用程序也将被支持,但只有 64 位运行时是现代的。

    如果您观看来自 WWDC 2011 的 Apple 演示文稿,尤其是“Objective-C Advancements In-Depth”,您会发现已经进行了许多底层改进以加快保留/发布过程,以及更快的@autoreleasepool 之类的东西。 LLVM ARC specification 中有完整的运行时支持部分。这些改进需要的不仅仅是编译器支持。

    我们已经不得不将现代运行时用于实例变量的自动合成等功能(如Apple's documentation 中所述),所以这并不是一个可怕的惊喜。

    即使是作为目标的 iOS 4.0 也缺乏对弱引用的支持,因此这里显然存在技术问题。正如其他人所断言的那样,这不仅仅是一种将开发人员推向新版本的营销策略。

    【讨论】:

    • ARC 不太可能需要 i386 上缺少的 x86-64 的某些功能,从而阻止其实施。 “技术”、“营销”、“资源”、“管理”、“实用”等都是主观术语。除非 Apple 的某个人选择将 OP 问题的所有答案都插入其中,否则充其量只是猜测。事实上,苹果公司的不同人,根据他们的角色,可能有不同的原因!关于它没有“明确” - 请注意在其他答案中使用“可能”和“猜测”。
    • @CRD - 也许您应该阅读上面的 Apple 文档,其中指出:“Mac OS X v10.5 及更高版本上的 iPhone 应用程序和 64 位程序使用现代版本的运行时。其他程序(Mac OS X 桌面上的 32 位程序)使用运行时的旧版本。”这不是关于 x86-64 与 i386,而是关于运行时功能。正如我所提到的,每个操作系统附带的运行时版本之间存在技术差异,并且需要足够新的运行时版本才能支持 ARC。将较新的运行时向后移植到较旧的操作系统版本是不可行的。
    • 除了 ARC 不能在 10.5 上运行......它使用现代运行时......为什么现代运行时不在 i386 上运行......等等。我们最终会争论图灵接下来的完整性:-)
    • 这是我所希望的答案。非常感谢楼主!
    • 布拉德,恭喜你的那颗小钻石!你打算穿上它;)
    【解决方案2】:

    docs of Apple 指出,在 ARC 的情况下,与 super 的 dealloc 链接是在运行时处理的。

    【讨论】:

      【解决方案3】:

      同样的问题是:

      为什么 NSRegularExpression 只被 iOS 4.0+ 和 Mac OS X 10.7(Lion)+ 支持?

      您在 Mac OS X 10.6.7(Snow Leopard) 中有完整的 iOS 5.0(显然是 4.0)模拟器,您可以轻松使用 NSRegularExpression,但 Mac OS X 10.6.7 本身不支持它。

      关于您的问题:ARC 是在 iOS 5.0 中引入的。那个时候iOS 3.x的用户已经不多了,所以我的看法是Apple有点懒得让ARC兼容iOS 3.x了。

      【讨论】:

        【解决方案4】:

        我的猜测是 clang 工具链(ARC 需要)不会构建与 iOS 3.x 兼容的二进制文件。

        另外,有几个 C 函数用于代替发送 -retain-release,这在 iOS 3.x 中可能不可用

        http://www.informit.com/articles/article.aspx?p=1745876

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-18
          • 2016-01-23
          • 1970-01-01
          • 1970-01-01
          • 2014-02-07
          • 2012-04-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多