这是为了澄清我对 ARC 的概念理解中的一些疑问。如果 ARC 是一种编译时技术,为什么它不能在所有版本的 iOS 和 OS X 上使用?
最佳答案
ARC 不仅仅是一种编译时技术。它还依赖于一些运行时组件。这有两个部分:
引用计数。在编译时,ARC 引入了对一堆辅助函数的调用。这些都是documented online ,但重要的是
objc_retain()
、objc_release()
和objc_autorelease()
。它们与在对象上调用-retain
、-release
或-autorelease
执行相同的操作,但可以进行一些额外的优化在具有运行时函数的 ARC 下(值得注意的是,当一个方法返回一个自动释放的对象并且调用者将值存储到一个强变量中时,自动释放 + 保留可以完全跳过)。这些运行时功能增加了操作系统要求。幸运的是,如果您的目标是较旧的操作系统,Xcode 可以链接到一个名为libarclite
的静态库中,该库提供这些功能的实现,从而允许您在针对较旧的操作系统(例如 iOS 4.3)时使用 ARC。缺点是这些函数没有“真正的”ARC 所做的优化,因此性能可能会受到轻微影响。归零弱引用支持。这还需要一组运行时函数,以及对内存管理在运行时工作方式的内部结构的一些更改,以及框架中的一些更改以更好地支持归零弱引用。内存管理的具体变化是为什么不能像 ARC 的其余部分那样使用
libarclite
向后移植弱引用支持。
关于objective-c - 旧版本 iOS 和 OS X 上的 ARC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14208427/