闽公网安备 35020302035485号
class Person {
let name: String
init(name: String) { self.name = name }
}
var person1: Person? = Person(name: "张三") // 引用计数 = 1
var person2 = person1 // 引用计数 = 2
person1 = nil // 引用计数 = 1
person2 = nil // 引用计数 = 0,对象被回收
看起来挺简单,但底层实现其实挺复杂。class Parent {
var child: Child?
}
class Child {
weak var parent: Parent? // 避免循环引用
}
如果 Parent 对象被销毁了,所有指向它的 weak 引用都要自动变成 nil。问题是系统怎么知道哪些 weak 引用指向这个对象?答案是 Side Table。class Customer {
let name: String
var card: CreditCard?
init(name: String) { self.name = name }
}
class CreditCard {
let number: UInt64
unownedlet customer: Customer// 信用卡肯定属于某个用户
init(number: UInt64, customer: Customer) {
self.number = number //堆代码 duidaim.com
self.customer = customer
}
}
unowned 引用不会增加引用计数,也不像 weak 那样自动变 nil。如果访问一个已经被销毁的对象得 unowned 引用——直接崩溃!强制正确使用:用 unowned 就得保证对象生命周期关系正确
.注意避免循环引用
.闭包捕获 self
// Delegate 用 weak
protocol MyDelegate: AnyObject {}
class MyClass {
weak var delegate: MyDelegate?
}
// 父子关系用 unowned
class Order {
unowned let customer: Customer // 订单肯定属于某个客户
}
写在最后