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。这使我们可以在闭包体内检查它们是否存在。 













你可能感兴趣的:(OC老鸟学Swift)