3

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

4

2 回答 2

6

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

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

  2. 归零弱参考支持。这还需要一组运行时函数,加上运行时内存管理工作方式的一些内部更改,以及框架中的一些更改以更好地支持归零弱引用。内存管理的变化特别是为什么不能libarclite像 ARC 的其余部分一样使用归零弱引用支持。

于 2013-01-08T05:03:49.293 回答
2

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

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

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

所以你可能会问,为什么 arclite 不能在所有旧版本的 iOS 和 OS X 上运行?我不确定(也许苹果以外的人都不知道)。一个合理的猜测是 arclite 需要挂钩到 Objective-C 运行时。运行时可以在操作系统版本之间更改。Apple 不想尝试支持他们曾经发布的每个版本的运行时,所以他们选择了合理的截止点,并让 arclite 支持这些截止点之后的每个版本。这简化了 arclite 实现并减少了测试负担。

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

于 2013-01-08T05:04:28.140 回答