这是为了澄清我对ARC的概念性理解中的一些疑问。如果ARC是编译时技术,为什么它不适用于所有版本的iOS和OS X?
答案 0 :(得分:5)
ARC不仅仅是一种编译时技术。它还依赖于一些运行时组件。这有两个部分:
引用计数。在编译时,ARC引入了对一堆辅助函数的调用。这些都是documented online,但重要的是objc_retain()
,objc_release()
和objc_autorelease()
。这些操作与在对象上调用-retain
,-release
或-autorelease
的操作相同,但是在ARC下可以使用运行时函数进行一些额外的优化(特别是在方法时)返回一个自动释放的对象,调用者将值存储到一个强变量中,autorelease + retain可以完全跳过。这些运行时功能是添加操作系统要求的功能。幸运的是,如果您定位较旧的操作系统,Xcode可以链接到名为libarclite
的静态库中,该库提供这些功能的实现,从而允许您在定位较旧的操作系统(例如iOS 4.3)时使用ARC。缺点是这些功能没有“真正的”ARC所做的优化,因此性能可能略有下降。
归零弱参考支持。这还需要一组运行时函数,以及对内存管理在运行时中如何工作的内部的一些更改,以及框架中的一些更改以更好地支持清零弱引用。内存管理的具体变化是为什么无法像使用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不包括对弱引用归零的支持。也许这是一个在旧版本的运行时上难以支持的功能,即使是在截止之后也是如此。