旧版iOS和OS X上的ARC

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

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

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

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

ARC需要一些运行时function。 这些function在clang ARC文档中 。

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

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

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

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