2014-02-17 25 views
0

由于苹果在2011年推出了自动引用计数,所以从未真正想过,但如果您看到ARC algorithm并且根据apple documentation所有对象在一段时间后都会被破坏。目标c用于内存管理的ARC AC算法,是垃圾收集?

enter image description here

如果我看到从WWDC 2011发布视频中可以看到,这是不是一个垃圾收集器。 所以问题是,如果它确实使用垃圾收集器算法并且所有对象最终都会被破坏,为什么不是垃圾收集器?

对不起,如果这已经问过,但我真的搞不清这个问题,我需要帮助,以充分理解它

+1

我不完全明白你的问题,或者确切地说你的困惑......垃圾收集器是一个通常定期运行并释放不再被程序引用的对象的软件。 ARC仅在编译时编译“保留”/“释放”语句。所以没有运行的软件可以清理ARC下的内存,这就是为什么它不是垃圾收集器。 –

+0

这就是我的想法,但一位老师今天真的搞砸了我的想法。 – jycr753

回答

4

这是一个有点哲学问题的,但本质上,它是一个编译时垃圾回收器,作为一个反对运行时间垃圾回收器。

而不是与程序一起运行的垃圾收集子系统,管理保留计数并确保所有必要的发布和保留都放在正确的位置。

这样做的实际结果是,因为它是由编译器完成,它不太容易出错比手动保留/释放,因为它在编译期时间完成的,它比垃圾收集得更快。

This question应该进一步阐明这个问题。

3

ARC与垃圾收集算法完全无关。自动引用计数(ARC)使用引用计数作为其确定对象可达性的基本机制。相比之下,垃圾收集算法维护着一个“根”对象列表(例如局部变量,静态变量,线程对象),并使用这些根来遍历对象图来检查对象的可达性。这个过程是非确定性的,因为你永远不知道什么时候GC算法要运行,何时不再引用的对象将被垃圾收集。你所知道的是他们最终会被垃圾收集,但“最终”可能意味着很长时间。由于GC使用图遍历进行可达性分析,因此它不关心图中的周期:如果某个对象可以从根集中的一组对象而不是到达,它仍然被认为是垃圾并且会被收集。因此,您不必担心保留周期 - 这是一个非常实际的问题,在使用引用计数系统时需要时刻牢记。

引用计数比垃圾收集要简单得多:每个对象的引用计数如图所示,retain递增,release递减。一旦计数达到零,对象就会被销毁。这就是它! ARC所做的就是自动将呼叫插入retainrelease。事实上,如果我们正在谈论新的ARC或者Cocoa的ARC之前的内存管理,单从这个图表是不可能的。在参考计数系统下,您可以确切知道什么时候您的物体将被释放 - 只要其参考计数达到零就会发生。自动释放使得这种方式对你来说可能不那么明显,因为最后一个引用可能会在代码之外被释放,但这不会使进程不确定。此外,该语言让你可以完全控制autoreleasing,让你创建自己的autorelease池。

+0

看到那个老师在@ user3319052提到我的想法...... – jycr753

+1

@ jycr753我认为引用计数和垃圾收集系统是不同的,可以分开处理。它们都实现了资源管理自动化的共同目标,但这也是它们相似之处的结局。调用其他各种方法对需要使用两者编程的程序员(例如来自Android背景的iOS开发人员或反之)都不利。认为两者基本相同会导致极小的错误,最终导致成本非常高,因为它们很难找到。 – dasblinkenlight

1

我想补充一点,GC通常会检查整个对象图以在循环引用中查找不可访问的对象。在ARC中 - 它仍然是RC - 只有一个被释放对象的关系才会被审查。如果您有循环引用,则永远不会执行,参与的对象将永远不会被释放。

1

显然我不能给出评论的答案(新帐户)。然而,@daskblinkenlight描述的内容正是Peter Sestoft编程语言概念定义为引用计数的垃圾回收(页179)。我真的没有看到区别。

而且,我写了问他的电子邮件,以彼得·塞斯托夫特(在ITU哥本哈根教授)如果ARC是一个垃圾收集和他给了以下的答案(丹麦翻译): “在我看来(和例如保罗Wilsons调查“单处理器垃圾收集技术”)ARC绝对是一个垃圾收集器。“

+1

我无法访问该书,因此我无法详细回答。问题是没有定义术语“垃圾收集”。在Objective-C语境中,请记住已有一个“传统”GC,引用的簿记在全局和异步完成,而在ARC中,簿记在本地和同步(=当一个对象被解除分配时)完成。如果你想在一般情况下使用GC这个词,你也可以称之为GC。这是一个定义问题。无论如何,从事GC工作的人都试图扩展定义。也许他们想要包含更多现代技术...... –