Swift ARC概述
内存管理函数及其使用是通过自动引用计数(ARC)来处理Swift 4语言中的。ARC用于初始化和反初始化系统资源,从而在不再需要实例时释放类实例使用的内存空间。ARC会跟踪有关代码实例之间关系的信息,以有效管理内存资源。
ARC的功能
- 每当通过init()创建一个新的类实例时,ARC会分配一块内存来存储信息。
-
实例类型及其值的信息存储在内存中。
-
当不再需要该类实例时,ARC会自动释放内存空间以供进一步的类实例存储和检索。
-
ARC会跟踪当前引用的类实例属性、常量和变量,以便仅对那些未使用的实例应用deinit()。
-
ARC会对那些正在使用的类实例属性、常量和变量维持一个”强引用”,以限制在类实例当前使用时的解除分配。
ARC程序
当我们使用playground运行上述程序时,我们将获得以下结果−
ARC 强引用循环类实例
当我们使用playground运行上面的程序时,我们得到以下结果 –
ARC 弱引用和无主引用
类类型属性有两种解决强引用循环的方法:
- 弱引用
- 无主引用
这些引用用于使一个实例能够引用循环中的其他实例。然后,这些实例可以引用每个实例,而无需关注强引用循环。当用户知道某个实例可能返回 ‘nil’ 值时,可以使用弱引用指示。当实例要返回的是非 nil 值时,使用无主引用来声明。
弱引用程序
当我们在playground上运行上面的程序时,我们得到以下结果 –
未持有引用计划
当我们在playground上运行上面的程序时,我们得到以下结果 –
闭包的强引用循环
当我们将闭包赋值给类实例属性,并在闭包体内捕获特定实例时,可能会发生强引用循环。对闭包的强引用是通过self.someProperty
或者self.someMethod()
来定义的。强引用循环用作闭包的引用类型。
当我们在playground中运行以上程序时,我们得到以下结果 –
弱引用和无主引用
当闭包和实例彼此相互引用时,用户可以将闭包中的捕获定义为无主引用。这样它不会允许用户同时释放实例。当实例有时返回一个’nil’值时,使用弱引用实例来定义闭包。
当我们在playground上运行以上程序时,我们得到以下结果 −