自动引用计数(Automatic Reference Counting)
Swift 使用自动引用计数(ARC)机制来跟踪和管理你的应用程序的内存。
通常情况下,你无须自己来考虑内存的管理。
在少数情况下,ARC 为了能帮助你管理内存,需要更多的关于你的代码之间关系的信息。
注意
引用计数法只适用于类的实例。
结构和枚举是值类型,而不是引用类型,而不是存储,并通过引用传递。
解决实例之间的循环强引用
Swift 提供了两种办法用来解决你在使用类的属性时所遇到的循环强引用问题:
弱引用(weak reference)和无主引用(unowned reference)。
弱引用
注意
弱引用(weak)必须声明为变量,以表明自己的价值可以在运行时改变。弱引用(weak)不能被声明为一个常数。
无主引用
和弱引用类似,无主引用不会牢牢保持住引用的实例。
和弱引用不同的是,无主引用是永远有值的。
因此,无主引用总是被定义为非可选类型(non-optional type)。
你可以在声明属性或者变量时,在前面加上关键字unowned表示这是一个无主引用。
由于无主引用是非可选类型,你不需要在使用它的时候将它展开。无主引用总是可以被直接访问。
不过 ARC 无法在实例被销毁后将无主引用设为nil,因为非可选类型的变量不允许被赋值为nil。
注意:
如果你试图在实例被销毁后,访问该实例的无主引用,会触发运行时错误。
使用无主引用,你必须确保引用始终指向一个未销毁的实例。
还需要注意的是如果你试图访问实例已经被销毁的无主引用,Swift 确保程序会直接崩溃,而不会发生无法预期的行为。
所以你应当避免这样的事情发生。
解决闭包引起的循环强引用
[unowned self,weak delegate=self.delegate!] in