Swift自动引用计数学习笔记
什么是自动引用计数?
Swift使用自动引用计数(ARC)机制来管理应用程序的内存。它会跟踪和计算代码中每个实例的引用次数,并在不再需要该实例时自动释放其内存。
如何避免循环引用?
有时候,在两个实例之间建立强引用会导致循环引用,这将导致内存泄漏。为了避免这种情况,我们可以使用弱引用和无主引用。
弱引用
使用弱引用时,如果被引用的对象被释放,弱引用自动变为nil。创建弱引用时,需要在变量或常量声明之前加上关键字 weak。
swiftCopy Codeclass Person {
var name: String
weak var partner: Person?
init(name: String) {
self.name = name
}
}
在上面的例子中,Person类包含一个弱引用变量partner,用于指向该对象的伙伴。
无主引用
如果引用的对象永远不会为nil,我们可以使用无主引用。与弱引用不同,无主引用声明前使用关键字unowned。
swiftCopy Codeclass Customer {
var name: String
var card: CreditCard!
init(name: String, card: CreditCard!) {
self.name = name
self.card = card
}
}
在上面的例子中,Customer类包含一个对CreditCard实例的无主引用。因为每个客户必须有一个信用卡,所以card属性被视为永远不会为nil。
实例
swiftCopy Codeclass 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 CodeMath is being deinitialized
John is being deinitialized