“内存是自动管理的” - 如何?

Posted

技术标签:

【中文标题】“内存是自动管理的” - 如何?【英文标题】:"Memory is managed automatically" - how? 【发布时间】:2014-06-03 15:24:08 【问题描述】:

我知道GC 和ARC 最大的区别在于GC 是运行时进程,而ARC 是在编译时运行。因此,在使用 ARC 时,开发人员在某些情况下需要注意内存。

然而根据this 的说法,SWFT 内存管理架构中没有留给开发人员交互的空间。

那么他们是怎么做到的呢?他们是否有清理内存的运行时进程,或者还有其他什么?

【问题讨论】:

由于 Swift 不是开源的,我怀疑是否有人能够给出一个好的答案。 “与 ARC 合作开发人员需要在某些情况下处理内存”是什么意思?斯威夫特没有区别。您仍然需要担心保留周期并使用weak 来打破它 【参考方案1】:

Swift 使用 ARC 的方式与 Objective-C 类似。 ARC has been discussed 广泛。

简而言之:

    没有垃圾收集器。 只要存在(强)引用,对象就会存在。 强引用不能循环,否则会泄漏内存。使用弱引用来打破循环。

【讨论】:

所以它并不完美,作为开发者我需要意识到这一点。对吗? “完美”似乎是一个非常具体的标签,所以我不会回答这个问题。而且,是的,在某些情况下,您必须了解内存管理,就像其他所有语言一样。 @GokhanArik garbage collection 通常意味着一个运行时进程,该进程遵循从一组根对象的可访问性来确定哪些对象不再使用。它的优点是它不易受到引用循环的影响,缺点是它可能是一个大的(通常是不确定的)运行时处理器接收器。 ARC 和其他引用计数方案在编译时做更多工作以在运行时获得确定性行为,但容易受到引用循环的影响。 @Ilya_Gazman 这不是真的:虽然 ARC 的主要概念是编译器自动插入保留和释放调用,但 ARC 已经添加了相当多的运行时功能。有许多新功能可以执行各种保留/释放/自动释放任务,以及新的自动释放池等。如果 ARC 是一种纯编译时技术,它将向后兼容 Mac OS X 10.0 和 ios 1.0。 @JeffWood Here's a description 引用计数系统中的引用周期。【参考方案2】:

我知道GC和ARC最大的区别就是GC

请注意,ARC 是 GC 的一种形式。

是运行时进程,而 ARC 在编译时运行。

跟踪 GC 和 ARC 都在编译时和运行时执行。 ARC 注入增加和减少引用计数的代码,当计数降至零时,收集对象并递归地减少它指向的所有引用(可能导致在运行时完成无限量的工作)对象图被收集)。

因此,在使用 ARC 时,开发人员在某些情况下需要注意内存。

是的。您必须始终小心避免循环,因为它们永远不会被收集。

【讨论】:

【参考方案3】:

ARC 的工作原理

每次创建一个类的新实例时,ARC 都会分配一个块 内存来存储有关该实例的信息。这段记忆拥有 有关实例类型的信息,以及值 与该实例关联的任何存储属性。

此外,当不再需要某个实例时,ARC 会释放 该实例使用的内存,以便该内存可用于其他 目的。这确保了类实例不占用 当不再需要它们时,内存中的空间。

但是,如果 ARC 要释放仍在使用的实例, 将无法再访问该实例的属性, 或调用该实例的方法。事实上,如果您尝试访问 例如,您的应用很可能会崩溃。

确保实例在静止时不会消失 需要时,ARC 会跟踪有多少属性、常量和变量 当前指的是每个类实例。 ARC 不会解除分配 实例,只要至少有一个对该实例的有效引用 仍然存在。

为了使这成为可能,每当您将类实例分配给 属性、常量或变量,该属性、常量或变量 对实例进行了强引用。参考被称为 “强”引用,因为它牢牢抓住那个实例,并且 不允许它被释放只要强 参考仍然存在。

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html

【讨论】:

这正是问题所在。这是否意味着他们使用运行时进程或编译时?此链接也出现在我的问题中。

以上是关于“内存是自动管理的” - 如何?的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用自动隐藏解决方案资源管理器(Visual Studio 2017)

如何管理自动释放对象的内存

bat如何自动获取管理员权限

oa办公自动化软件如何做到高效管理?

如何使用自动布局根据 webview 内容管理 UITableHeaderView 的高度

如何让程序开机自动启动,并以管理员权限运行