旧版iOS和OS X上的ARC

时间:2013-01-08 04:56:00

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

这是为了澄清我对ARC的概念性理解中的一些疑问。如果ARC是编译时技术,为什么它不适用于所有版本的iOS和OS X?

2 个答案:

答案 0 :(得分:5)

ARC不仅仅是一种编译时技术。它还依赖于一些运行时组件。这有两个部分:

  1. 引用计数。在编译时,ARC引入了对一堆辅助函数的调用。这些都是documented online,但重要的是objc_retain()objc_release()objc_autorelease()。这些操作与在对象上调用-retain-release-autorelease的操作相同,但是在ARC下可以使用运行时函数进行一些额外的优化(特别是在方法时)返回一个自动释放的对象,调用者将值存储到一个强变量中,autorelease + retain可以完全跳过。这些运行时功能是添加操作系统要求的功能。幸运的是,如果您定位较旧的操作系统,Xcode可以链接到名为libarclite的静态库中,该库提供这些功能的实现,从而允许您在定位较旧的操作系统(例如iOS 4.3)时使用ARC。缺点是这些功能没有“真正的”ARC所做的优化,因此性能可能略有下降。

  2. 归零弱参考支持。这还需要一组运行时函数,以及对内存管理在运行时中如何工作的内部的一些更改,以及框架中的一些更改以更好地支持清零弱引用。内存管理的具体变化是为什么无法像使用ARC的其余部分那样使用libarclite向后移植弱引用支持。

答案 1 :(得分:2)

ARC需要一些运行时功能。这些功能在clang ARC documentation

iOS 5.0和Mac OS X 10.7(及更高版本)包含这些功能。

为了允许您将应用程序部署到较旧的OS版本,Apple包含一个名为“arclite”的静态库,它定义了大多数这些功能。如果您的部署目标是较旧的操作系统,Xcode会将您的应用与arclite链接。

所以你可能会问,为什么不能在所有旧版本的iOS和OS X上工作?我不确定(可能没有Apple以外的人)。一个合理的猜测是arclite需要挂钩到Objective-C运行时。运行时可以在OS的各个版本之间进行更改。 Apple不想尝试支持他们发布的每个版本的运行时,因此他们选择了合理的截止点,并且自那些截止日期以来,每个版本都支持arclite。这简化了arclite实现并减少了测试负担。

请注意,arclite不包括对弱引用归零的支持。也许这是一个在旧版本的运行时上难以支持的功能,即使是在截止之后也是如此。