Swift 弱引用与无主引用

本文介绍Swift中解决循环引用的方法:弱引用与无主引用。通过示例演示如何使用weak关键字实现弱引用,避免可选类型实例间的循环引用;并展示unowned关键字用于非可选类型的无主引用,确保实例间正确引用而不产生循环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

  • 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")
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值