如何使用弱引用和无主引用来中断引用周期?
#第二种情况
当一个属性被允许为nil而另一个属性不能为nil
。
在这种情况下,无主引用最适合打破潜在的强引用周期。
什么是无人参考?
例如,使用未拥有的引用的生存 期比其他实例更长或更长 。
这意味着引用为“无主”的实例将始终具有值,因此始终将其声明为非可选的。 ARC永远不会将无主引用设置为nil,即使其引用的对象已释放。 因此,您应确保不要释放未拥有的引用,否则,如果尝试访问它,则会导致运行时错误。
例:
让我们考虑一个客户和BankAccount的示例。 在这里,Customer和BankAccount之间的关系与Person and Appartment示例略有不同。
客户可能有也可能没有银行帐户,但银行帐户将始终与客户关联。 让我们看看这将如何导致潜在的强参考周期。
客户类别{
命名:字符串
var account:BankAccount?
init(name:String){
self.name =名称
}
deinit {print(“ \(name)正在被初始化”)}
}
Class BankAccount {
让号:UInt64
让客户:客户
init(数字:UInt64,客户:客户){
self.number =数字
self.customer =客户
}
deinit {
打印(“正在取消初始化具有帐号\(number)的BankAccount”)
}
}
如您在上面的代码中所看到的,我们已经在BankAccount类中将客户属性设置为常量或非可选,因为我们知道银行帐户在客户中将始终具有客户和可选帐户属性,因为客户可能拥有或可能没有银行帐户。
var harry:客户?
哈里=客户(名称:“哈里”)
harry?.account = BankAccount(号码:1323243214214,客户:哈里!)
哈里=零
如果运行上面的代码,则不会看到任何deinit方法被调用。 因此,内存不会释放,而我们将面临内存泄漏。
让我们借助图表进行查看。