• 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
  • 相关阅读:
    Spark&Hive结合起来
    spark&dataframe
    JAVA-数组或集合
    九种经典排序算法详解(冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序,计数排序,桶排序,基数排序)
    B+树介绍
    @transactional注解在什么情况下会失效,为什么。
    一个ArrayList在循环过程中删除,会不会出问题,为什么?
    Java:传值还是传引用?
    Java序列化的方式。
    实现动态代理的两种方式
  • 原文地址:https://www.cnblogs.com/xwoder/p/4745840.html
Copyright © 2020-2023  润新知