Swift类实例与循环引用的解决

代码-情形1:

// 两个属性的值都允许为nil,这种场景最适合用弱引用来解决
class Person {
    let name: String
    init(name: String) {
        self.name = name
    }
    // 弱引用
    var apartment: Apartment?
    deinit {
        print("\(name) is being deinitialized")
    }
}

class Apartment {
    let number: Int
    init(number: Int) {
        self.number = number
    }
    // 弱引用
    weak var tenant: Person?
    deinit {
        print("Apartment #\(number) is being deinitialized")
    }
}

var John: Person? = Person(name: "John")
var Number73: Apartment? = Apartment(number: 73)

John!.apartment = Number73
Number73!.tenant = John

John = nil
Number73 = nil

 

代码-情形2:

// 一个属性的值允许为nil,而另一个属性的值不允许为nil,这种场景最适合通过无主引用来解决
class Customer {
    let name: String
    var card: CreditCard?
    init(name: String) {
        self.name = name
    }
    deinit {
        print("\(name) is being deinitialized")
    }
}

class CreditCard {
    let number: UInt64
    // 无主引用,不会对实例产生强引用
    unowned let customer: Customer
    init(number: UInt64, customer: Customer) {
        self.number = number
        self.customer = customer
    }
    deinit {
        print("Card #\(number) is being deinitialized")
    }
}

var john: Customer? = Customer(name: "John Appleseed")
john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)

john = nil

 

代码-情形3:

// 两个属性都必须有值,并且初始化完成后永远不会为nil
// 这种场景最适合通过一个类使用无主属性,而另外一个类使用隐式解析可选属性来解决
class Country {
    let name: String
    var capitalCity: City!
    init(name: String, capitalName: String) {
        self.name = name
        self.capitalCity = City(name: capitalName, country: self)
    }
    deinit {
        print("Country named \(name) is being deinitialized")
    }
}

class City {
    let name: String
    unowned let country: Country
    init(name: String, country: Country) {
        self.name = name
        self.country = country
    }
    deinit {
        print("City named \(name) is being deinitialized")
    }
}

var country: Country? = Country(name: "Canada", capitalName: "Ottawa")

country = nil

 

转载于:https://www.cnblogs.com/xwoder/p/4745840.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值