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

Iphone Objective-C自动引用计数和垃圾收集之间有什么区别?,iphone,ios,garbage-collection,automatic-ref-counting,Iphone,Ios,Garbage Collection,Automatic Ref Counting,随着Xcode 4.2中引入了新的自动引用计数(ARC),我们不再需要在Objective-C中手动管理保留/释放 这似乎类似于垃圾收集,如Mac上Objective-C和其他语言中的垃圾收集。ARC与垃圾收集有何不同?正如我在回答中所述,ARC可以提供最佳的手动内存管理和垃圾收集跟踪功能。它主要消除了开发人员跟踪Objective-C对象上的手动保留、释放和自动删除的需要,同时也避免了对垃圾收集器进程的需要,因为垃圾收集器进程可能会耗尽移动设备上的有限资源,并在运行的应用程序中偶尔造成口吃 A

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


这似乎类似于垃圾收集,如Mac上Objective-C和其他语言中的垃圾收集。ARC与垃圾收集有何不同?

正如我在回答中所述,ARC可以提供最佳的手动内存管理和垃圾收集跟踪功能。它主要消除了开发人员跟踪Objective-C对象上的手动保留、释放和自动删除的需要,同时也避免了对垃圾收集器进程的需要,因为垃圾收集器进程可能会耗尽移动设备上的有限资源,并在运行的应用程序中偶尔造成口吃

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

与ARC相比,跟踪垃圾收集有一个小小的优势,即ARC,在ARC中跟踪垃圾收集可以提取这些数据

关于这个主题的一本伟大的读物来自于,克里斯·拉特纳(Chris Lattner)有这样一句话:

与ARC相比,GC的主要优势在于它收集数据 周期。第二个优点是“保留”的任务是 “原子”是因为它们是一个简单的存储。ARC有几个大的 与libauto-GC相比的优势:

  • 它具有对象的确定性回收(当对象的最后一个强引用消失时),其中GC“在某个时候”释放对象 稍后”。这定义了GC中可能存在的一类微妙的bug 由于收集器未在中触发而未公开的应用程序 车窗”
  • ARC的高水位线通常比GC低得多,因为对象释放得更快
  • libauto提供了一个脆弱的编程模型,您必须小心不要丢失写障碍等
  • 并不是所有的系统框架都是GC干净的,而且随着它们的发展,这些框架偶尔也会倒退
  • ARC不受假根的影响。libauto保守地扫描堆栈,这意味着看起来像指针的整数可以根 对象图
  • ARC没有任何启动和停止您的应用程序的功能,这会导致UI口吃。libauto在GC实现方面相当先进 因为它不会立即停止每个线程,但它仍然会停止 通常会停止所有UI线程

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

    简短而甜蜜的回答如下:

    java的GC是运行时,而ARC是编译时

    GC在运行时引用对象,并检查对象运行时的依赖关系。 当ARC附加发布、保留时,autorelease会在compiletime调用

    ARC与垃圾收集有何不同

    ARC是垃圾收集的一种形式


    您的意思可能是“ARC和跟踪垃圾收集(如JVM和.NET)之间有什么区别?”。主要的区别在于电弧速度较慢,并且存在泄漏循环。这就是JVM和.NET都使用跟踪垃圾收集器的原因。有关更多信息,请阅读。

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

    GC依赖于基于运行时的“可访问”对象,使其在多线程环境中高效运行

    活动 ARC将代码注入到可执行文件中,并根据未使用对象的引用计数对其“自动”执行

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

    自动参考计数的优点
    • 实时、确定性地销毁对象 未使用的
    • 没有后台处理
    垃圾收集的优点
    • GC可以清理整个对象图,包括保留周期
    • GC在后台进行,因此所做的内存管理工作更少 作为常规应用程序流程的一部分
    自动参考计数的缺点
    • ARC无法自动处理保留循环
    垃圾收集的缺点
    • 因为GC发生在后台,所以对象的确切时间范围 释放尚未确定
    • 发生GC时,应用程序中的其他线程可能会 暂时搁置

    与libauto相比,ARC的另一个优点是不会减少虚拟地址空间。请看,我要强调的是,Chris Lattner专门谈论libauto,而不是一般地跟踪垃圾收集。我还要指出,ARC是垃圾收集的一种形式,所以谈论“ARC vs GC”是没有意义的。你的意思是“ARC vs tracing GC”。@Asik-也许我的措辞不准确。我对上面的内容进行了改进,以表明我的意思,因为引用计数所需的保留和释放是在编译时插入的。当然,引用计数本身发生在运行时,但关键是这避免了跟踪垃圾收集所需的收集器进程。这个问题的上下文是关于Objective-C(libauto)垃圾收集的,所以我假设阅读本文的人会理解“垃圾收集”指的是使用收集器进程跟踪垃圾收集。