swift 循环强引用
2016-03-02 15:57
337 查看
Swift使用自动引用计数(ARC)来管理应用程序的内存使用。在大多是情况下,并不需要考虑内存的管理。当实例不再需要的时候,ARC会自动释放这些实例所使用的内存。
但ARC并不是绝对安全的。下面两种情况会发生内存泄露。
1,类实例之间的循环强引用
两个类实例都有一个强引用指向对方,这样的情况就是强引用循环,从而导致内存泄露。
解决办法:使用弱引用
只需要将上述例子Teacher类的student变量加上关键字weak,或者将Student类的teacher变量加上关键字weak。
当A类中包含有B类的弱引用的实例,同时,B类中存在A的强引用实例时,如果A释放,也不会影响B的释放。但A的内存回收要等到B的实例释放后才可以回收。
2,闭包引起的循环强引用
将一个闭包赋值给类实例的某个属性,并且这个闭包体中又使用了实例,也会发生强引用循环。
解决办法:使用闭包捕获列表
当闭包和实例之间总是引用对方并且同时释放时,定义闭包捕获列表为无主引用。但捕获引用可能为nil时,定义捕获列表为弱引用。弱引用通常是可选类型,并且在实例释放后被设置为nil。
原文出自:www.hangge.com 转载请保留原文链接:http://www.hangge.com/blog/cache/detail_742.html
但ARC并不是绝对安全的。下面两种情况会发生内存泄露。
1,类实例之间的循环强引用
两个类实例都有一个强引用指向对方,这样的情况就是强引用循环,从而导致内存泄露。
只需要将上述例子Teacher类的student变量加上关键字weak,或者将Student类的teacher变量加上关键字weak。
当A类中包含有B类的弱引用的实例,同时,B类中存在A的强引用实例时,如果A释放,也不会影响B的释放。但A的内存回收要等到B的实例释放后才可以回收。
将一个闭包赋值给类实例的某个属性,并且这个闭包体中又使用了实例,也会发生强引用循环。
当闭包和实例之间总是引用对方并且同时释放时,定义闭包捕获列表为无主引用。但捕获引用可能为nil时,定义捕获列表为弱引用。弱引用通常是可选类型,并且在实例释放后被设置为nil。
相关文章推荐
- Swift - 多线程实现方式
- Swift编程的15个技巧
- swift——图片添加点击事件
- 《从零开始学Swift》学习笔记(Day 71)——Swift与C/C++混合编程之数据类型映射
- Swift 简单封装UISwipeGestureRecognizer + 闭包回调监听事件,便于不同场景的 UIView调用
- 《从零开始学Swift》学习笔记(Day 71)——Swift与C/C++混合编程之数据类型映射
- xcode7真机测试swift出现错误no suitable image found
- Swift-- 最让人蛋疼的就是? ! ??
- Swift base64转成图片,以及图片转成 base64的方法
- 《从零开始学Swift》学习笔记(Day 35)——会使用下标吗?
- 《从零开始学Swift》学习笔记(Day 34)——静态属性是怎么回事?
- 《从零开始学Swift》学习笔记(Day 33)——属性观察者
- 《从零开始学Swift》学习笔记(Day 32)——计算属性
- 《从零开始学Swift》学习笔记(Day 31)——存储属性
- 《从零开始学Swift》学习笔记(Day 30)——选择类还是结构体呢?
- 《从零开始学Swift》学习笔记(Day 29)——访问级别
- 《从零开始学Swift》学习笔记(Day 28)——总结使用问号(?)和感叹号(!)
- 《从零开始学Swift》学习笔记(Day 27)——可选类型
- 《从零开始学Swift》学习笔记(Day 27)——可选类型
- 《从零开始学Swift》学习笔记(Day 26)——可选链