生产质量的Cocoa应用程序中是否使用垃圾回收?

7

我主要想知道垃圾回收对性能的影响。在发布应用程序时,使用垃圾回收是否会受到反感?

我能想到的另一个问题是,使用垃圾回收可能会导致编程更加松散。

你在你的应用程序中使用垃圾回收吗?

5个回答

22

垃圾回收被广泛应用于许多生产质量的应用程序中。例如,Xcode、Automator、系统首选项和其他几个系统应用程序都使用了GC,您可以预期随着时间的推移这种趋势会继续。

此外,许多开发人员已经采用了GC,并且在他们的应用程序中专门使用它。例如,Intuit公司的新版Quicken和QuickBooks for Mac就是使用垃圾回收技术的。

GC有许多优点。从我个人的经验出发,以下是其中一些优点:

  • 它使得多线程更加容易;一个简单的赋值语句就是对所有权的原子声明。

  • 它将许多内存管理工作卸载到其他核心上;它是自然并发的,并卸载了大量计算任务从主线程(或计算线程)。

  • 在许多情况下,分配和释放内存可以完全在线程上下文中进行,从而消除了全局同步或锁定的需求。

  • 随着Mac OS X每个版本的发布,垃圾回收器变得越来越快,这种趋势将继续(就像系统的其他部分一样)。通过将更多的应用程序计算负载卸载到系统提供的框架中,您的应用程序将从底层系统的优化中获得越来越多的好处。

  • 因为垃圾回收器对内存中对象之间的指针和对象图形具有密切的了解,所以它使得分析和调试显着变得更容易。现在的问题不是“这个悬空指针从哪里来的?”,而是“告诉我为什么这个对象比我预期的存在更长时间的原因列表?”。

这并不意味着在GC下没有努力让您的应用程序最优化的工作。当然还有这样的任务!


4
值得注意的是,垃圾收集在10.8中已被弃用。 - Nick Moore
值得注意的是,10.11将是包含垃圾回收运行时的OS X的最后一个版本。使用垃圾回收的应用程序可能无法在10.12上正常运行或完全无法运行。 - Andrew

5
垃圾回收技术诞生于20世纪60年代,并已被应用于许多发布的应用程序中。所有.NET应用程序都使用垃圾回收。苹果在Xcode中使用libauto。
垃圾回收通常会导致Cocoa应用程序质量更好,因为开发者不再需要承担内存管理的负担。有很多Cocoa应用程序存在内存泄漏! (尽管可能不是大量的内存)
我倾向于使用gc,因为我可以更快地完成我的应用程序,而不必担心消息僵尸对象!

还有很多垃圾收集的应用程序会泄漏。只是它们泄漏的可能性更小。 - Lothar

3

我尽可能地使用垃圾回收(GC),因为最好的代码是一开始就不必编写的代码。此外,正如Bbum在上面指出的那样,运行在GC下意味着您可以获得更多的信息进行性能分析,如果需要调试任何瓶颈。


1

垃圾回收对于任何新的Cocoa应用程序都是推荐的,苹果公司通过在Xcode中使用它来展示自己的实践。性能是一个有趣的情况,因为虽然您很可能会消耗更多的CPU周期,但由于收集器的多线程和访问方法的简化,在某些领域,应用程序实际上可能会变得更快。

计算机是为我们做工作而设计的。Cocoa的引用计数通常很容易管理,但现在垃圾回收是它可以完成的另一项工作--让机器去做这份工作,这样您就可以专注于重要的事情!


1

和其他人一样,我强烈建议使用GC。性能开销通常可以忽略不计!我不需要重复其他用户所述的好处。

然而,我也强烈鼓励编写库,而不是应用程序,以在非GC模式下运行。有些环境无法运行GC代码,其中最著名的是iPhone;因此,如果您为自己创建了一个内部库,并计划稍后将其重用于iPhone应用程序,则建议设计它以便在非GC环境中也能正常工作。

将GC代码转换为非GC代码比另一种方式更加困难!


2
尽管某些环境(如iPhone和pre-Leopard)不支持GC,但您可以以双模式编译库。这需要一些额外的工作,但肯定是可行的。我已经为开源的CHDataStructures框架自己完成了这项工作。 - Quinn Taylor
@Quinn,完全同意。不过,我澄清了我的帖子,表明我的意思是应该编写库以便在非GC环境中使用。 - notnoop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接