Ios 目标c使用ARC AC算法进行内存管理,这是垃圾收集吗?

Ios 目标c使用ARC AC算法进行内存管理,这是垃圾收集吗?,ios,objective-c,algorithm,Ios,Objective C,Algorithm,自从苹果公司在2011年推出自动引用计数以来,从未真正考虑过它,但如果你看到和根据所有对象在一段时间后被销毁 如果我看到发布视频从你可以看到,这不是一个垃圾收集器。 所以问题是,如果它确实使用了垃圾收集器算法,并且所有对象最终都被销毁了,那么为什么不是垃圾收集器呢 很抱歉,如果以前有人问过这个问题,我真的很困惑,我需要帮助来更好地理解它这是一个哲学问题,但本质上,它是编译时垃圾收集器,而不是运行时垃圾收集器 不是与程序一起运行的垃圾收集子系统,而是管理保留计数并确保将所有必要的释放和保留放在正确

自从苹果公司在2011年推出自动引用计数以来,从未真正考虑过它,但如果你看到和根据所有对象在一段时间后被销毁

如果我看到发布视频从你可以看到,这不是一个垃圾收集器。 所以问题是,如果它确实使用了垃圾收集器算法,并且所有对象最终都被销毁了,那么为什么不是垃圾收集器呢


很抱歉,如果以前有人问过这个问题,我真的很困惑,我需要帮助来更好地理解它

这是一个哲学问题,但本质上,它是编译时垃圾收集器,而不是运行时垃圾收集器

不是与程序一起运行的垃圾收集子系统,而是管理保留计数并确保将所有必要的释放和保留放在正确的位置

实际结果是,由于它是由编译器完成的,因此比手动保留/释放更不容易出错,而且因为它是在编译时完成的,所以比垃圾收集器更快


ARC与垃圾收集算法毫无关系。自动引用计数ARC使用引用计数作为其底层机制,用于对对象的可达性进行决策。相反,垃圾收集算法维护根对象列表,例如局部变量、静态变量、线程对象,并使用这些根遍历对象图以检查对象的可达性。这个过程是不确定的,因为您永远不知道GC算法何时运行,也不知道不再引用的对象何时会被垃圾收集。你所知道的是它们最终会被垃圾收集,但最终可能意味着很长一段时间

由于GC使用图遍历进行可达性分析,所以它不关心图中的循环:如果某个对象可以从不在根集中的某个对象集访问,则它仍然被视为垃圾并将被收集。因此,您不必担心保留周期—在使用引用计数系统时,您需要始终牢记这一非常现实的问题


引用计数比垃圾收集简单得多:每个对象都有一个图中显示的引用计数,retain递增,release递减。一旦计数为零,对象就会被销毁。真的是这样!ARC所做的只是自动插入保留和释放调用。事实上,如果我们讨论的是新的ARC,或者Cocoa的预ARC内存管理,那么单从这个图是不可能判断的。在参考计数系统下,你确切地知道你的物体什么时候会被释放——只要它的参考计数达到零,它就会发生。自动删除会使您不太容易看到这一点,因为最后一个引用可能会在代码之外发布,但这不会使流程不确定。此外,该语言允许您通过创建自己的自动释放池来完全控制自动释放。

我想补充的是,GC通常会查看整个对象图,以在循环引用中找到无法访问的对象。在ARC中–仍然是RC–仅审查正在解除锁定的对象的关系。如果你有一个循环引用,这将永远不会完成,参与的对象将永远不会被解除锁定。

显然,我无法回答新帐户的评论。然而,@daskblinkenlight所描述的正是《编程语言概念》一书中定义的通过引用计数的垃圾收集(第179页)。我看不出有什么区别

此外,我给国际电联哥本哈根分会的Peter Sestoft教授发了一封电子邮件,问他ARC是否是垃圾收集站,他给出了以下丹麦语翻译的答案:
在我看来,例如Paul Wilson,单处理器垃圾收集技术ARC绝对是一个垃圾收集器

我不太明白你的问题,或者你到底对什么感到困惑。。。垃圾收集器是一种软件,通常定期运行并释放程序不再引用的对象。ARC只在编译时编译retain/release语句。因此,在ARC下没有运行清理内存的软件。这就是为什么它不是垃圾收集器。这也是我的想法,但今天一位老师真的把我的想法搞砸了。@jycr753我认为引用计数和垃圾收集系统是完全不同的,可以分开处理。它们都有一个共同的目标,即自动化资源管理,但这就是它们的相似之处。将其中一个调用为另一个的各种调用会对需要同时使用这两种语言编程的程序员造成伤害,例如,来自一家公司的iOS开发人员
ndroid背景,或反之亦然。如果认为这两本书本质上是一样的,就会导致一些微小的错误,而这些错误的代价非常高昂,因为它们很难找到。我没有那本书,因此无法详细回答。问题是术语垃圾收集没有定义。在Objective-C上下文中,请记住,有一个传统的GC,引用的簿记是全局和异步进行的,而在ARC中,簿记是本地和同步进行的=当对象被解除锁定时。如果您想更一般地使用术语GC,也可以将其称为GC。这是一个定义问题。不管怎样,从事GC工作的人试图扩展定义。也许他们想要包括更多的现代技术…