ARC Swift中内存管理的第一种方法-第1部分

ARC代表自动引用计数,它是Objective-C和Swift的Clang编译器的功能,可以为我们管理内存。

每次创建类实例时,ARC都会分配一块内存,该空间将存储与该实例相关的所有信息。 一旦您的代码不使用它,ARC就会取消分配该类实例,因为应用程序不再需要它。

ARC仅适用于引用类型 ,不适用于值类型,如Swift中的“ 结构”或“ 枚举”

因为我想向您展示如何使用对象图管理内存,所以我在Xcode中创建了一个简单的视图项目,而不是Playground文件。

下面的示例显示ARC如何处理内存:

如上所示,为类实例分配的内存仍然存在。 即使将nil分配给’reference1’和’reference2’,分配的内存也不会释放。 这是因为还有另一个引用指向以前创建的实例,因此ARC在需要之前不会释放此内存。

您可以在下面的示例中看到:

尽管ARC通常可以成功地为应用程序管理内存,但是在某些情况下,我们需要提供额外的信息。 定义代码各部分之间的关​​系将有助于我们避免诸如强引用保留周期或内存泄漏之类的问题。


在前面的示例中,跟踪ARC如何为我们管理内存确实很容易,但是当我们开始编写复杂的代码时,这将变得更加困难。 因此,在向ARC提供信息时我们需要小心。

在编程时,我们最常犯的错误是有两个指向彼此的不同引用。 由于它们都是在内存中分配并使用的,因此ARC将永远不会释放内存,因为这种环境会导致强大的参考周期。 即使将“ nil”分配给这些实例,仍将分配内存。

在下一个示例中,我们将创建一个保留周期,并观察如何处理内存。

可以看到,没有调用’deinit’函数,这是因为类实例仍然存在。

提示:只需查看内存检查器中的紫色警告图标,即可轻松检测保留周期内存泄漏

为了解决此问题,我们可以为参考提供额外的信息,以便ARC在管理内存时将其考虑在内。 在这种情况下,我们将把“ B”类到“ A”类的“ a”引用设置为“弱”以避免这种问题。


ARC是一项强大的功能,可帮助我们避免iOS上的内存处理。 但是,在某些情况下,我们需要特别注意。 将两个引用相互指向会导致强烈的引用周期,这不是预期的行为,因此我们需要通过提供一些额外的信息来避免此问题。

下一部分见,我们将通过一些示例了解这些关系之间的差异以及如何正确使用“ ”和“ 无主 ”。