如何使用弱引用和无主引用来中断引用周期?

#第二种情况

当一个属性被允许为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方法被调用。 因此,内存不会释放,而我们将面临内存泄漏。

让我们借助图表进行查看。