弱引用
class Person {
var name: String
var car: Car?
init(name: String) {
self.name = name
}
}
class Car {
var carName: String
weak var user: Person?
init(carName: String) {
self.carName = carName
}
}
let a = Person(name: "person")
let b = Car(carName: "car")
a.car = b
//此时不会循环引用 因为user是weak
b.user = a
无主引用
class Person {
var name: String
var car: Car?
init(name: String) {
self.name = name
}
}
class Car {
var carName: String
unowned var user: Person
init(carName: String, user: Person) {
self.carName = carName
self.user = user
}
}
let a = Person(name: "person")
//此时不会循环引用 因为user是unowned
a.car = Car(carName: "car", user: a)
当导致循环引用的属性是可选的,使用weak,非可选时使用unowned
在可选时也是可以使用unowned的,但必须保证属性总会引用到一个合法对象或 nil
在闭包中使用
var a = "abc"
lazy var someClosure: () -> String = {
[unowned self] in
return self.a + "123"
}
在闭包和捕获的实例self总是互相引用并且总是同时释放时,因此使用无主引用。
相反,在被捕获的引用可能会变为 nil 时,则使用弱引用。