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 时
可以这样标注闭包中的元素,指定它们的内存管理语义: