zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    个人第四次作业
    个人第四作业
    英语学习app——Alpha发布2
    英语学习app——Alpha发布1
    团队作业---系统设计
    团队第二次作业:需求分析
    第三次作业:结对编程
    团队第一次作业
    Web测试实践 第二天
    Web测试实践 第一天
  • 原文地址:https://www.cnblogs.com/xwoder/p/4745840.html
Copyright © 2011-2022 走看看