iOS为什么没有自动垃圾回收功能?

14

在iOS上使用Objective-C进行开发时,内存管理目前必须由开发人员执行。其他一些移动平台使用自动垃圾回收来消除管理内存的需要。

为什么在iOS设备上不使用垃圾回收呢?


1
标题有误(但标签正确)。Objective-C具有GC,但在iOS上不支持。 - BoltClock
a) 主观和争议性的 b) 稍等片刻。 - Abizern
1
我建议我们对于保留和丢弃的内容应该有更多的控制。不过,它确实在对象上具有“自动释放池”,类似于垃圾回收机制。 - Dan Hanly
2
我认为这个问题是有效的。我相信其他人也会想到这个问题,而被接受的答案可能会提供一些关于Obj-C和Cocoa-Touch如何工作的更深入的见解。好好想想吧 ;) - Dan Hanly
1
@Sherm Pendley,在一个简单的项目中,这并不需要太多的工作。随着项目复杂度和循环引用的增加——我们认为在所有现代语言中都是“自由”的东西——确保您的对象实际上在正确的点被保留可能会增加很多项目开销,而且它也有一点难以调试,因为对象引用在意想不到的时间被释放。 - Dan Rosenstark
显示剩余2条评论
3个回答

20

垃圾回收的问题在于内存使用会持续增长直到进行回收,因此可能会分配比实际需要更多的内存。这对于内存受限且无法交换的设备来说是不利的。

当垃圾回收器运行时,它会扫描堆以查找不再使用的内存,这是一个昂贵的过程,会导致设备变慢直到完成为止。


3
它会重复地执行它的功能。 - BoltClock
+1 为垃圾回收过程的内存使用量!这是一个不被立即考虑到的事情。你只是默认垃圾回收会节省内存! - Dan Hanly
“...所以可能会分配比必要更多的内存。” 不是可能,而是一定会 - FreeAsInBeer
1
这只是垃圾回收(GC)的过度简化。它们要复杂得多,例如研究代际GC(相当标准),它可以快速收集短寿命对象,而更长寿命的对象则更少被检查回收。这只是基本思路,在实践中还有许多优化和微调。还可以看到“增量”回收,解决“冻结”问题。它们甚至可以并发。迄今为止,我不明白为什么苹果选择了ARC,他们给出的原因似乎过于简单化。引用计数本身也有相当大的开销。 - TaylanKammer

10

在2011年的WWDC上,苹果公司解释说他们不希望移动设备使用垃圾回收机制,因为他们希望应用程序能够以最佳的资源利用和确定性运行。垃圾回收机制的问题不仅在于对象会随着时间的推移而累积,直到垃圾收集器启动清理,还在于你无法控制垃圾收集器何时启动。这会导致非确定性行为,可能会在你不想要它们发生的时候导致减速。

底线:你无法确定某个时间点对象将被释放,并且不会与正在发生的其他事件冲突。


3
现在使用自动引用计数,你可以兼顾两全其美:开发者不再需要担心对象的保留/释放,也不会有垃圾收集器随机减缓执行速度,同时仍能保持对内存使用的相当严格控制。 - Brad Larson
2
@Brad:没错!如果你真的想使用MRC(手动引用计数),你可以这么做。你甚至可以将同时使用两种引用计数系统的文件合并。 - FreeAsInBeer
你的底线并不是完全正确的。根据你的垃圾回收器,可能有强制回收和推迟回收的方法。后者通常通过预先创建对象池,然后重复使用它们并避免在关键操作期间进行任何分配来完成。因为GC通常是通过分配触发的。请注意,即使在手动内存管理中,也会使用此无分配策略,因为alloc()/free() 也并不便宜。同样的原因,UITableView重用单元格等,“不要分配”适用于所有性能关键的情况。 - TaylanKammer
顺便说一下,无论我读了多少关于内存管理的论文,它们都不断提到引用计数的总资源使用量比好的垃圾回收器高,尤其是 CPU 时间,尽管它与程序执行交织在一起(指针更新时的原子引用计数更改)。因此,ARC 是否提供了“最佳使用所提供的资源”是值得怀疑的。确定性更容易理解,但例如 CoreAnimation 无论如何都在自己的线程中运行,不应因 GC 或其他任何事情而出现抖动。我很想在某个复杂的应用程序上触发 GC,然后简单地观察会发生什么... - TaylanKammer

3
主要原因可能是内存负载和性能。相对于垃圾回收,引用计数具有更小的内存占用量,允许应用程序使用更多内存。此外,在垃圾回收运行时,其他线程必须停止,这可能会导致移动设备的用户界面出现卡顿,但在具备快速多核处理器的 Macintosh 上不会成为一个很大问题。
争论也可能很快就无意义了,因为 Clang / LLVM 新增了一个名为“自动引用计数” 的功能。它利用分析功能自动输入保留、释放和自动释放,使程序员不必自己手动输入。

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