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

2020/12/01 20:22 · ios ·  · 0评论

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

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

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

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

跟踪垃圾收集相对于ARC的一个小优势是ARC将不会为您处理保留周期,在这种情况下,跟踪垃圾收集可以处理这些保留周期

关于这个主题的精彩读物来自Apple的Objective-C邮件列表中的该主题,克里斯·拉特纳(Chris Lattner)表示:

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

  1. 它具有对象的确定性回收(当最后一个对对象的强引用消失时),GC会在“某个时候以后”释放对象。这定义了GC应用程序中可能存在的一类细微的错误,这些错误由于收集器不会在“错误的窗口中”触发而不会公开。
  2. ARC的高水位线通常比GC低得多,因为对象会更快地释放。
  3. libauto提供了一个脆弱的编程模型,您必须注意不要丢失写障碍等。
  4. 并非所有的系统框架都是GC干净的,并且随着它们的发展,框架偶尔会退化。
  5. ARC不会遭受错误的根源。libauto保守地扫描堆栈,这意味着看起来像指针的整数可以根对象图。
  6. ARC没有任何东西可以启动并停止您的应用程序,从而导致UI停顿。就GC实现而言,libauto相当先进,因为它不会立即停止每个线程,但通常仍会停止所有UI线程。

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

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

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

运作方式

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

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

自动参考计数的优点

  • 在对象变得不使用时对其进行实时的确定性销毁。
  • 没有后台处理。

垃圾收集的优势

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

自动参考计数的缺点

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

垃圾回收的缺点

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

ARC与垃圾回收有何不同?

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

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

简短而甜美的答案如下:

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

GC在运行时引用了对象,并检查对象运行时的依赖性。ARC在编译时附加释放,保留,自动释放调用。

本文地址:http://ios.askforanswer.com/objective-czidongyinyongjishuhelajihuishouyoushenmequbie.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!