25.自动引用计数

2021-07-27  本文已影响0人  LucXion

实例之间的相互强引用

  1. 弱引用:两个属性都可能为nil

    class Boat {
        weak var passanger:Person? // 弱引用,引用对象被销毁后自动置为nil,修饰可选属性,且符合引用对象析构在先的自然语言,乘客下船了,船就没乘客了
    }
    class Person {
        var boat:Boat?
    }
    
  2. 无主引用:一个属性可能为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
        }
    }
    
  3. 两个属性都必须有值,并且初始化完成后永远不会为 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()(而不只是 somePropertysomeMethod())。这提醒你可能会一不小心就捕获了 self

lazy var someClosure = {
  // 定义捕获列表
    [unowned self, weak delegate = self.delegate]
    (index: Int, stringToProcess: String) -> String in
    // 这里是闭包的函数体
}
上一篇 下一篇

猜你喜欢

热点阅读