zoukankan      html  css  js  c++  java
  • Swift 弱引用与无主引用

    前言

    • Swift 提供了两种解决循环引用的方法,弱引用和无主引用。

    • 弱引用和无主引用可以使循环中的一个实例引用另一个实例时不使用强引用。

    1、弱引用

    • 对生命周期中会变为 nil 的实例采用弱引用,也就是说对可选类型采用弱引用。

    • 声明一个弱引用的关键字为 weak

    1.1 弱引用示例

    • 比如存在一个学生类,一个班级类,学生类有一个属性叫学生所属的班级,而班级有一个属性是班长,它引用了一个学生类,它们都是可选型。

      class Student {
          var name: String?
          weak var theClass: Class?
          
          deinit {
              print("Student deinit")
          }
      }
      
      class Class {
          var name: String?
          weak var classMonitor: Student?
          
          deinit {
              print("Class deinit")
          }
      }
      
      var sneb: Class? = Class()
      sneb?.name = "sannianerban"
      
      var xiaoming: Student? = Student()
      xiaoming?.name = "xiaoming"
      
      sneb?.classMonitor = xiaoming
      xiaoming?.theClass = sneb
      
    • 因为班长对小明的引用为弱引用,不会算作引用计数,所以此时实例 xiaoming 的引用计数为 0,调用析构器释放内存空间,现在可以自由释放 sneb 这个实例的空间了。

      sneb = nil
      xiaoming = nil
      

    2、无主引用

    • 对初始化后再也不会变为 nil 的实例采用无主引用,也就是说对非可选类型采用无主引用。

    • 声明一个无主引用的关键字为 unowned

    2.1 无主引用示例

    • 修改上例中的属性。

      class Class {
          var name: String?
          unowned var classMonitor = Student()
          
          deinit {
              print("Class deinit")
          }
      }
      
  • 相关阅读:
    852. Peak Index in a Mountain Array
    841. Keys and Rooms
    832. Flipping an Image
    821. Shortest Distance to a Character
    824. Goat Latin
    如何生成git的公钥和私钥
    学习笔记
    加快JavaScript加载和执行效率
    PO BO VO DTO POJO DAO概念及其作用
    jvm 垃圾回收区的形象说明
  • 原文地址:https://www.cnblogs.com/QianChia/p/8870272.html
Copyright © 2011-2022 走看看