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上的内存处理。 但是,在某些情况下,我们需要特别注意。 将两个引用相互指向会导致强烈的引用周期,这不是预期的行为,因此我们需要通过提供一些额外的信息来避免此问题。
下一部分见,我们将通过一些示例了解这些关系之间的差异以及如何正确使用“ 弱 ”和“ 无主 ”。