只有iOS 4.0及更高版本支持ARC的技术原因是什么?
我的理解是它是一个编译器功能,它只是自动插入与内存管理相关的代码,而不是要求开发人员这样做。根据我的阅读,调用本身保持不变 - 至少这是苹果Transitioning to ARC Guide所暗示的。
因此,它不应该涉及以前版本的iOS中没有出现的功能,尽管稍后介绍过,ARC确实可以与iOS 4.0一起使用。
我出于好奇而问这个问题,实际上并不需要让ARC与iOS 3.x一起工作。
答案 0 :(得分: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中有关于运行时支持的整个部分。这些改进不仅需要编译器支持。
我们已经不得不使用现代运行时来实现自动合成实例变量等功能(如Apple's documentation中所述),所以这并不是一个可怕的惊喜。
即使iOS 4.0作为目标也缺乏对弱引用的支持,因此这里有明显的技术问题。这不仅仅是推动开发人员使用新版本的营销策略,正如其他人所声称的那样。
答案 1 :(得分:4)
docs of Apple表示在ARC的情况下,在运行时处理dealloc链接到super。
答案 2 :(得分: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
,但Mac OS X 10.6.7本身并不支持它
关于你的问题:ARC是在iOS 5.0中引入的。当时不再有很多iOS 3.x用户了,所以我的观点是Apple太懒了,不能让ARC与iOS 3.x兼容。
答案 3 :(得分:1)
我的猜测是clang工具链(ARC所需)不会构建与iOS 3.x兼容的二进制文件。
此外,还有一些C函数用于代替发送可能在iOS 3.x中不可用的-retain
和-release