【发布时间】:2012-12-13 16:42:09
【问题描述】:
关于objective c ARC 机制有很多关于SO 的问题。
很多人问ARC是不是要代替GC等等,甚至有讨论
对于 Mac 应用程序,从 GC 移至 ARC 是合理的(如果在处理某些数据类型中的复杂引用等不需要太多工作)。
ARC 的明显缺点是完全没有任何清理循环引用的机制(编辑:循环strong 引用)。
这里有一个很好很简单的关于内存泄漏的解释ARCWhat kind of leaks does automatic reference counting in Objective-C not prevent or minimize?
苹果ARC 相对于GC 优势的有趣概述。
http://lists.apple.com/archives/objc-language/2011/Jun/msg00013.html
我非常了解GC 的工作原理以及它存在什么样的问题,
但是从 C#/.NET world 移动到 objective c / Cocoa 并阅读有关 ARC 的内容我仍然无法得到一件简单的事情 - 为什么没有后台机制来清理 ARC 应用程序中的循环引用。
它不需要线程挂起,是吗?所以拥有相对便宜。实施有问题吗? GC 的轻量级版本,它可以在不暂停应用程序线程的情况下扫描堆栈、注册、构建图形、查找循环引用并释放内存,听起来很酷,不是吗?
它需要大量的计算或其他资源吗?我很难想象如何在不构建所有对象图的情况下找到循环引用,但假设这个过程是背景的并且是连续的,那么即使这样应该也可以吗?
.NET 4.5 GC (http://blogs.msdn.com/b/dotnet/archive/2012/07/20/the-net-framework-4-5-includes-new-garbage-collector-enhancements-for-client-and-server-apps.aspx) 的性能有了很大的提升,但是在 ARC 系统中拥有循环引用收集器会让第二个成为赢家吗? ARC系统进化的下一步是什么?如果有可能并且有时会发生ARC 将具有循环引用收集器,那么它是否可以完全取代GC,或者下一代GCs(具有更好的性能)将消除ARC 系统?
UPD:请不要发布关于 weak 引用的帖子,我知道如何处理 ARC 中的循环引用,这很明显,问题是关于将循环引用收集器添加到现有 ARC 的可能性机制,因为它会像现代 GC 一样强大和通用
【问题讨论】:
-
Max,我想看看您如何避免循环缓冲区中的循环引用,或者说包含旅行推销员问题中所有城市和道路的图形...
-
为什么不呢?与 GC 相比,这是 ARC 的主要缺点
-
保持一个 nsarray 或 nsdictionary 具有指向图中所有节点的强指针,并在图中内部使用弱指针。弱指针是 ARC 中用于解决循环引用问题的机制。 (他们摇滚)。
-
对我而言,ARC 或手动内存管理优于 GC 的主要优势是确定性,即我确切地知道我的对象在何时何地被销毁。
-
@taras,参考的主要优势。计数是更好的性能(希望如此)、更好的确定性、最佳的内存占用空间等等。 ARC 是自动的!
标签: c# objective-c garbage-collection automatic-ref-counting