Swift自动引用计数学习笔记

什么是自动引用计数?

Swift使用自动引用计数(ARC)机制来管理应用程序的内存。它会跟踪和计算代码中每个实例的引用次数,并在不再需要该实例时自动释放其内存。

如何避免循环引用?

有时候,在两个实例之间建立强引用会导致循环引用,这将导致内存泄漏。为了避免这种情况,我们可以使用弱引用和无主引用。

弱引用

使用弱引用时,如果被引用的对象被释放,弱引用自动变为nil。创建弱引用时,需要在变量或常量声明之前加上关键字 weak。

swiftCopy Code
class Person { var name: String weak var partner: Person? init(name: String) { self.name = name } }

在上面的例子中,Person类包含一个弱引用变量partner,用于指向该对象的伙伴。

无主引用

如果引用的对象永远不会为nil,我们可以使用无主引用。与弱引用不同,无主引用声明前使用关键字unowned。

swiftCopy Code
class Customer { var name: String var card: CreditCard! init(name: String, card: CreditCard!) { self.name = name self.card = card } }

在上面的例子中,Customer类包含一个对CreditCard实例的无主引用。因为每个客户必须有一个信用卡,所以card属性被视为永远不会为nil。

实例

swiftCopy Code
class Student { var name: String var course: Course? init(name: String) { self.name = name } deinit { print("\(name) is being deinitialized") } } class Course { var name: String var student: Student? init(name: String) { self.name = name } deinit { print("\(name) is being deinitialized") } } var john: Student? var math: Course? john = Student(name: "John") math = Course(name: "Math") john?.course = math math?.student = john john = nil math = nil

在上面的例子中,我们创建了两个类(Student和Course),并将它们链接在一起。由于它们相互引用,如果没有适当地处理,将导致循环引用并导致内存泄漏。

在最后一行代码中,我们将john和math设置为nil。这将释放它们的引用,并自动释放它们占用的内存。

输出:

Copy Code
Math is being deinitialized John is being deinitialized