Swift学习笔记-内存管理
避免循环引用
Swift 和 Objective-C 一样使用了自动引用计数来进行内存管理。引用计数的内存管理就无可避慢的会产生循环引用这种问题。Swift 针对这个问题也给出了 weak 和 unowned 两种声明非持有所有权的引用修饰符。二者的区别在于 weak 和 Obj-C 中的 weak 完全相同,声明一个弱引用,不会增加被引用内存的引用计数,在所指向的内存被释放时指针会自动被置为 nil。unowned 则类似于 Obj-C 中的 unsafe_unretain 修饰符,作用和 weak 相同,但在所致内存被释放后不会被自动置为 nil,而是保留指向原来内存空间的引用,若对象已经被释放后对其发生了方法调用则会造成崩溃。
苹果的推荐使用方法是:在能够确定在访问时对象一定没有被释放的情况下使用 unowned,在不能够确定时使用 weak,这么做的原因我想是因为使用 weak 时由于在内存释放时需要对指针进行置空操作,耗费了一定的性能,所以能够确定的情况下使用 unowned 比较好。
使用弱引用的情况:
- 设置 delegate 时
 - 在 self 持有的闭包中引用 self 时
 
可以这样标注闭包中的元素,指定它们的内存管理语义: