swift文档笔记(十三) -- 循环引用

对象的相互持有会引起 循环引用



1.解决实例之间的循环强引用 


弱引用

声明属性或者变量时,在前面加上 weak关键字表明这是一个弱引用。 ARC会在引用的实例被销毁后自动将其赋值为 nil。并且因为弱引用可以允许它们的值在运行时被赋值为 nil,所以它们会被定义为可选类型变量,而不是常量。 



无主引用 

你可以在声明属性或者变量时,在前面加上关键字 unowned表示这是一个无主引用。无主引用通常都被期望拥有值。不过 ARC无法在实例被销毁后将无主引用设为 nil,因为非可选类型的变量不允许被赋值为 nil 


 使用无主引用,你必须确保引用始终指向一个未销毁的实例。

 如果你试图在实例被销毁后,访问该实例的无主引用,会触发运行时错误。





2.闭包的循环强引用 

产生场景: 

self.someThing.closure = {

self.someMethod()

}

两个条件:把闭包赋值给了self里的某个属性;

  在闭包中使用了self的属性或方法。


解决闭包引起的循环强引用 

在定义闭包时同时定义捕获列表作为闭包的一部分,通过这种方式可以解决闭包和类实例之间的循环强引用。


lazy var someClosure: (Int, String) -> String = { [unowned self, weak delegate = self.delegate!](index: Int, stringToProcess: String) -> String in 

   // 这里是闭包的函数体 

在闭包和捕获的实例总是互相引用并且总是同时销毁时,将闭包内的捕获定义为无主引用  

相反的,在被捕获的引用可能会变为 nil时,将闭包内的捕获定义为弱引用 。弱引用总是可选类型,并且当引用 的实例被销毁后,弱引用的值会自动置为 nil。这使我们可以在闭包体内检查它们是否存在。 













  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值