实例之间的相互强引用
-
弱引用:两个属性都可能为nil
class Boat { weak var passanger:Person? // 弱引用,引用对象被销毁后自动置为nil,修饰可选属性,且符合引用对象析构在先的自然语言,乘客下船了,船就没乘客了 } class Person { var boat:Boat? }
-
无主引用:一个属性可能为nil,一个属性必然有值
class Customer { var name:String = "信用卡持卡人" var card:CreditCard? } class CreditCard { var carNum:String = "信用卡卡号" unowned let customer :Customer //无主引用,不会自动置为nil,修饰非可选属性,符合自然语言中的,一张卡必然对应一个持卡人 init(carNum:String,customer:Customer) { self.carNum = carNum self.customer = customer } }
-
两个属性都必须有值,并且初始化完成后永远不会为
nil
。在这种场景中,需要一个类使用无主属性,而另外一个类使用隐式解包可选值属性。class Country { let name: String var capitalCity: City!//默认为nil init(name: String, capitalName: String) { self.name = name // 根据两段式构造,这一句代码后,self 即被创建并传递 self.capitalCity = City(name: capitalName, country: self) } } class City { let name: String unowned let country: Country init(name: String, country: Country) { self.name = name self.country = country } }
闭包的循环强引用
循环引用产生的场景:将一个闭包赋值给类实例的某个属性,并且这个闭包体中又使用了这个类实例时
Swift 有如下要求:只要在闭包内使用
self
的成员,就要用self.someProperty
或者self.someMethod()
(而不只是someProperty
或someMethod()
)。这提醒你可能会一不小心就捕获了self
。
lazy var someClosure = {
// 定义捕获列表
[unowned self, weak delegate = self.delegate]
(index: Int, stringToProcess: String) -> String in
// 这里是闭包的函数体
}
网友评论