Swift 弱引用与无主引用

前言

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

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

1、弱引用

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

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

1.1 弱引用示例

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    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")
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    var sneb: Class? = Class()
    sneb?.name = "sannianerban"

    var xiaoming: Student? = Student()
    xiaoming?.name = "xiaoming"

    sneb?.classMonitor = xiaoming
    xiaoming?.theClass = sneb
  • 因为班长对小明的引用为弱引用,不会算作引用计数,所以此时实例 xiaoming 的引用计数为 0,调用析构器释放内存空间,现在可以自由释放 sneb 这个实例的空间了。

    1
    2
    sneb = nil
    xiaoming = nil

2、无主引用

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

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

2.1 无主引用示例

  • 修改上例中的属性。

    1
    2
    3
    4
    5
    6
    7
    8
    class Class {
    var name: String?
    unowned var classMonitor = Student()

    deinit {
    print("Class deinit")
    }
    }
文章目录
  1. 1. 前言
  2. 2. 1、弱引用
    1. 2.1. 1.1 弱引用示例
  3. 3. 2、无主引用
    1. 3.1. 2.1 无主引用示例
隐藏目录