Objective-C自动引用计数和垃圾收集有什么区别?

Gau*_*ing 55 iphone garbage-collection ios automatic-ref-counting

通过Xcode 4.2中引入的新自动引用计数(ARC),我们不再需要在Objective-C中手动管理保留/释放.

这看起来类似于垃圾收集,就像Mac上的Objective-C和其他语言一样.ARC如何与垃圾收集不同?

Bra*_*son 65

正如我在这里的回答中所描述的那样,ARC可以提供手动内存管理和跟踪垃圾收集的最佳功能.它主要消除了开发人员跟踪Objective-C对象上的手动保留,发布和自动释放的需要,同时避免了垃圾收集器进程的需要,这可能会占用移动设备上的有限资源并导致正在运行的应用程序中出现断断续续的异常情况.

ARC通过应用所有Objective-C开发人员多年来不得不使用的规则,在编译时插入引用计数所需的相应保留和释放.这使开发人员不必自己管理它.因为在编译时插入了保留和释放,所以不需要收集器进程来连续扫描内存并删除未引用的对象.

跟踪垃圾收集优于ARC的一个小优点是ARC 不会为您处理保留周期,其中跟踪垃圾收集可以选择这些.

关于这个主题的精彩读物来自Apple的Objective-C邮件列表中的这个主题,其中Chris Lattner这样说:

GC相对于ARC的主要优点是它可以收集保留周期.第二个优点是"保留"分配是"原子的",因为它们是一个简单的存储.ARC比libauto GC有几大优势:

  1. 它具有确定性的对象回收(当对象的最后一个强引用消失时),GC在某个时间"释放"对象.这定义了一类可能存在于未暴露的GC应用程序中的细微错误,因为收集器不会在"错误窗口"中触发.
  2. ARC的高水位标记通常远低于GC,因为物体会更快释放.
  3. libauto提供了一个脆弱的编程模型,你必须小心不要丢失写入障碍等.
  4. 并非所有的系统框架都是GC干净的,并且框架在它们发展时偶尔会回归.
  5. ARC不会遭受假根.libauto保守地扫描堆栈,这意味着看起来像指针的整数可以根对象图.
  6. ARC没有任何内容可以启动和停止你的应用程序,导致UI口吃.就GC实现而言,libauto非常先进,因为它不会立即停止每个线程,但它通常最终会停止所有UI线程.

我目前正在将手动内存管理项目以及使用Objective-C垃圾回收的项目迁移到ARC.在一些Mac应用程序中使用垃圾收集一段时间之后,我发现将这些项目移动到ARC有一些显着的优势.

  • 我要强调的是,Chris Lattner正在专门讨论libauto而不是一般性地跟踪垃圾收集.我还要指出ARC是垃圾收集的一种形式,所以谈论"ARC vs GC"是不合情理的.你的意思是"ARC vs tracing GC". (5认同)
  • ARC over libauto的另一个优点是不会减少虚拟地址空间.请参见http://stackoverflow.com/a/5522746/104790 (3认同)
  • @Asik - 也许我的措辞不精确.我已经对上面的内容进行了改进,以表明我的意思,因为引用计数所需的保留和释放是在编译时插入的内容.当然,引用计数本身是在运行时发生的,但关键是这样可以避免跟踪垃圾回收所需的收集器进程.这个问题的上下文是关于Objective-C(libauto)垃圾收集,所以我假设有人读这个会理解"垃圾收集"是指跟踪垃圾收集,带有收集器进程. (3认同)
  • @Asik - 就口吃而言,ARC是对象和对象图解除分配的确定性.这与对象在不再需要时被释放的事实相结合,意味着在实践中你看到的东西远远少于以特定间隔扫描对象图的收集器进程.此外,它是确定性的这一事实使得很容易识别解除分配导致故障或暂停的点,并重新设计适当的操作以避免或显着减少这种情况. (2认同)

Mes*_*ery 13

ARC依赖于编译时"引用"对象,这使得它在低功耗模式环境(移动设备)中有效.

GC依赖于基于运行时的"可到达"对象,这使得它在多线程环境中变得高效.

手术

ARC将代码注入可执行文件,以便根据其引用计数"自动"在未使用的对象上执行.

GC在运行时工作,因为它将检测未使用的对象图(将消除保留周期)并在不确定的时间间隔内删除它们

自动参考计数的优点

  • 对象在未使用时的实时,确定性破坏.
  • 没有后台处理.

垃圾收集的优点

  • GC可以清理整个对象图,包括保留周期.
  • GC在后台进行,因此作为常规应用程序流程的一部分,将完成更少的内存管理工作.

自动参考计数的缺点

  • ARC无法自动处理保留周期.

垃圾收集的缺点

  • 由于GC在后台发生,因此对象释放的确切时间框架未确定.
  • 当GC发生时,应用程序中的其他线程可能暂时被搁置.


Jon*_*rop 8

ARC如何与垃圾收集不同?

ARC是垃圾收集的一种形式.

您可能意味着"ARC和跟踪垃圾收集(如JVM和.NET)之间有什么区别?".主要区别在于ARC较慢且泄漏周期.这就是JVM和.NET都使用跟踪垃圾收集器的原因.有关更多信息,请参阅如何比较引用计数和跟踪垃圾收集?.


归档时间:

查看次数:

22592 次

最近记录:

9 年,1 月 前