objective-c - 旧版本 iOS 和 OS X 上的 ARC

标签 objective-c ios macos memory-management automatic-ref-counting

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

最佳答案

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

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

  2. 归零弱引用支持。这还需要一组运行时函数,以及对内存管理在运行时工作方式的内部结构的一些更改,以及框架中的一些更改以更好地支持归零弱引用。内存管理的具体变化是为什么不能像 ARC 的其余部分那样使用 libarclite 向后移植弱引用支持。

关于objective-c - 旧版本 iOS 和 OS X 上的 ARC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14208427/

相关文章:

java - 在 macOS BigSur 中更改 Java 版本

ios - 当我使用委托(delegate)将值传递给另一个 ViewController 时,我发现委托(delegate)什么都不做

执行 Swift 库时 iOS 崩溃

ios 日期选择器到 unix 时间戳

ios - 如何向每个单元格添加一个按钮?

python - 如何在 Mac OS X 的 python 中处理 raw_input() 的 EOFError

ios - 为对象双属性排序数组

objective-c - iPhone游戏编程: Framework for this game?

ios - 具有自动布局和 UITableAutomaticDimension 的动态高度表单元格(动态 UILabel + 几个 UIImageViews)

xcode - 我可以在 macOS 10.12 上上传 Xcode 版本吗