unowned参数

48 阅读1分钟
class 会员 {
    var 处理中的订单: 订单?
    
    deinit {
        print("会员被释放")
    }
}

class 订单 {
    var 订购者: 会员  //因为订单一定要有订购者,所以在这里设定unowend
    
    init(订购者: 会员) { self.订购者 = 订购者 }
}

var user: 会员? = 会员()
var order: 订单? = 订单(订购者: user!)
user?.处理中的订单 = order

user = nil
order = nil

print("执行结束")

上面这个例子中,

第一步:

声明了两个类,分别是会员类和订单类。

其中“会员类”中有一个“处理中的订单”的属性(这个属性是optional)

“订单类”中有一个“订购者”的属性。

第二步:

生成了两个实例,实例user和实例order。

实例user使用“处理中的订单”属性,这个属性引用了“order”,order属于“订单类”。

实例order使用了“订购者”属性,这个属性引用了“user”,user属于“会员类”。

第三步:

让实例user和order的值均为空。

第四部:

此时执行程序,只会发生最后一行,印出执行结束,因为目前程序发生了retain cycle。循环引用。

循环引用情况是这样发生的:
存在一个实例user,类型是会员类
存在一个实例order,类型是订单类,
实例order(订单类)的属性中,“订购者”属性,引用了user
实例user(会员类)的属性中,“处理中的订单”属性,引用了order

如果没有发生循环强引用的话,会印出“会员被释放”,打印这句话的print,在“会员类”中。

合理的做法是,对class订单的订购者属性加上unowned关键字,断开强链接。