美文网首页
解决实例之间的循环强引用:weak,unowned

解决实例之间的循环强引用:weak,unowned

作者: g_h_j | 来源:发表于2020-07-08 15:23 被阅读0次

1、两个属性都允许为nil

生命周期中会变为nil,使用弱引用,一定是可选类型的,设置为nil时,不会调用属性观察者

class Person{

    let name:String

    var apartment:Apartment?

    init(name:String) {

        self.name = name

    }

    deinit {

        NSLog("Customer deinit")

    }

}

class Apartment{

    let unit:String

    weak var person:Person?

    init(unit:String) {

        self.unit = unit

    }

    deinit {

        NSLog("CreditCard deinit")

    }

}

2、一个属性允许为nil,另一个属性不允许为nil

初始化赋值后再也不会被赋值为nil的实例,使用无主引用,非可选类型,不允许设置为nil.

试图在实例被释放后访问无主引用,将触发运行时错误。试图访问引用的实例已经被释放了的无主引用,会crash.

class Customer{

    let name:String

    var card:CreditCard?

    init(name:String) {

        self.name = name

    }

    deinit {

        NSLog("Customer deinit")

    }

}

class CreditCard{

    let number:UInt64

    unowned let customer:Customer

    init(number:UInt64,customer:Customer) {

        self.number = number

        self.customer = customer

    }

    deinit {

        NSLog("CreditCard deinit")

    }

}

3、两个属性都不能为nil,需要一个类使用无主属性,另一个类使用隐式展开的可选属性(属性后有!)

class Country{

    let name:String

    var capCity:City!//隐式展开的可选属性

    init(name:String,capCityName:String) {

        self.name = name

        self.capCity = City.init(name: capCityName, country: self)

    }

    deinit {

        NSLog("Country deinit")

    }

}

class City{

    let name:String

    unowned let country:Country

    init(name:String,country:Country) {

        self.name = name

        self.country = country

    }

    deinit {

        NSLog("City deinit")

    }

}

相关文章

网友评论

      本文标题:解决实例之间的循环强引用:weak,unowned

      本文链接:https://www.haomeiwen.com/subject/cbjccktx.html