ios - Objective-C 如何高效地进行引用计数?

标签 ios objective-c garbage-collection automatic-ref-counting reference-counting

我正在上一门关于编译器的大学类(class),我们刚刚讲完垃圾收集和释放内存的方法。然而,在类讲授和我们的教科书中,我被引导相信引用计数并不是管理内存的好方法。

原因是引用计数非常昂贵,因为程序必须插入许多额外的指令来递增和递减引用计数。此外,每次引用计数发生变化时,程序都必须检查它是否等于零,如果是,则回收内存。

我的教科书上什至有一句话:“总的来说,引用计数的问题大于它的优点,在编程语言环境中很少用于自动存储管理。”

我的问题是:这些担忧是否合理? Objective-c 是否以某种方式避免了它们?如果是怎么办?

最佳答案

引用计数确实具有有意义的开销,这是事实。然而,跟踪垃圾收集器的“经典教科书”解决方案也并非没有缺点。最大的一个是不确定性,但暂停与吞吐量也是一个重要问题。

但最终,ObjC 并没有真正的选择。最先进的复制收集器需要 ObjC 所没有的语言的某些属性(例如,没有原始指针)。因此,尝试将教科书解决方案应用于 ObjC 最终需要一个部分保守的、非复制的收集器,这实际上与重新计数的速度大致相同,但没有其确定性行为。

(edit) 我个人的感觉是吞吐量是次要的,甚至是第三次的,真正重要的争论归结为确定性行为与循环收集和通过复制进行堆压缩。这三个都是如此有值(value)的属性,我很难选择一个。

关于ios - Objective-C 如何高效地进行引用计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16323929/

相关文章:

php - 长时间运行的 php 脚本的内存注意事项

ios - 未找到 Alamofire 框架(Xcode-8.2.1 和 iOS 10.2)

ios - ios6 应用程序中的选项卡栏导航错误

iphone - 自动布局按钮位置

objective-c - 将 NSView 添加到窗口而不是在顶部?

java - 一旦执行异步任务任务,变量就会丢失数据

iOS - UITableView 删除一个部分中的所有行

iOS Facebook api,已发送但未收到请求?

iphone - 配置具有多个条件的 NSPredicate

java - Web 应用程序中的静态变量是否会导致内存泄漏(从角度来看是 OutOfMemory)?