旧版iOS和OS X上的ARC

Sam*_*din 3 macos memory-management objective-c ios automatic-ref-counting

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

Lil*_*ard 5

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

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

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