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

What is the difference between Objective-C automatic reference counting and garbage collection?

随着Xcode4.2中引入了新的自动参考计数(ARC),我们不再需要在Objective-C中手动管理保留/释放。

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


正如我在这里的回答中所描述的,ARC可以提供最好的手动内存管理和跟踪垃圾收集。它基本上消除了开发人员跟踪Objective-C对象的手动保留、释放和自动释放的需要,但又避免了垃圾收集器过程的需要,垃圾收集器过程会耗尽移动设备上的有限资源,并导致运行中的应用程序偶尔出现口吃。

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

跟踪垃圾收集相对于ARC的一个微小优势是ARC不会为您处理保留周期,在这里跟踪垃圾收集可以收集到这些保留周期。

关于这个主题的一篇伟大的文章来自苹果公司的Objective-C邮件列表,其中Chris Lattner说:

The primary advantage of GC over ARC is that it collects retain
cycles. A secondary advantage is that"retained" assignments are
"atomic" because they are a simple store. ARC has several big
advantages over libauto GC:

  • It has deterministic reclamation of objects (when the last strong reference to the object goes away) where GC frees an object"sometime
    later". This defines away a class of subtle bugs that can exist in GC
    apps that aren't exposed because the collector doesn't trigger"in the
    buggy window".
  • The high water mark is generally much lower with ARC than GC because objects are released sooner.
  • libauto provides a fragile programming model, you have to be careful to not lose write barriers etc.
  • not all of the system frameworks are GC clean, and the frameworks do occasionally regress as they evolve.
  • ARC doesn't suffer from false roots. libauto conservatively scans the stack, which means that integers that look like pointers can root
    object graphs.
  • ARC doesn't have anything that kicks in and stops your app, causing UI stutters. libauto is pretty advanced as far as GC implementations
    go because it doesn't immediately stop every thread, but it still does
    usually end up stopping all the UI threads.
  • 我目前正在将我的手动内存管理项目以及那些使用Objective-C垃圾收集的项目迁移到ARC。在几个Mac应用程序中使用垃圾收集一段时间后,我看到了将这些项目转移到ARC中的一些显著优势。


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

    GC依赖于基于运行时的"可访问"对象,这使得它在多线程环境中高效。

    操作

    ARC向可执行文件中注入一个代码,根据未使用对象的引用计数对其"自动"执行。

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

    自动参考计数的优点

    • 实时、确定性地销毁对象未使用的
    • 没有后台处理。

    垃圾收集的优势

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

    自动参考计数的缺点

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

    垃圾收集的缺点

    • 因为GC发生在后台,对象的确切时间范围释放尚未确定。
    • 当发生GC时,应用程序中的其他线程可能暂时搁置。


    How does ARC differ from garbage collection?

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

    您的意思可能是"ARC和跟踪垃圾收集(如JVM和.NET)之间的区别是什么?"主要区别在于电弧速度慢,泄漏周期长。这就是为什么JVM和.NET都使用跟踪垃圾收集器的原因。有关详细信息,请阅读参考计数和跟踪垃圾收集的比较方法?.


    简短而贴切的回答如下:

    Java的GC是运行时,而ARC是编译时间。

    GC在运行时引用对象,并检查对象运行时的依赖关系。当arc附加释放、保留和自动释放调用compileTime时。