- Published on
weak和unowned在Swift中的用法
- Authors
- Name
weak和unowned都是自动引用计数(ARC)内存管理下的关键字。 其中weak表示弱引用,如果其引用计数变成0,那么这个对象会被置为nil。根据这个特性,weak只能修饰Optional的类型。因为其值有可能为nil。 其中unowned的作用是也不会增加引用计数的值,但是必须保证对象在使用期间不被释放。是非Optional类型。
class Customer {
let name: String
var card: CreditCard?
init(name: String) {
self.name = name
}
deinit {
print("\(name) 被释放了")
}
}
class CreditCard {
let number: UInt64
unowned let customer: Customer //每一张信用卡,一定会有主人
init(number: UInt64, customer: Customer) {
self.number = number
self.customer = customer
}
deinit {
print("信用卡 \(number) 被释放了")
}
}
var tom: Customer? = Customer(name: "Tom")
tom?.card = CreditCard(number: 1234_5678, customer: tom!)
tom = nil
这是一个互相持有的例子,如果没有unonwed来修饰CreditCard中的customer,那么就会出现强引用循环,这两个类实例都不会被释放。 如何添加unowned,那么当我们将tom置为nil的时候,tom和tom.card都会释放。没有强引用循环了。
这里为什么不用weak而是要用unowned,这是由customer是不是可选类型来决定的。每一张信用卡,都会有一个主人,只要信用卡存在,customer就不会为nil,所以这里使用unowned。