近期看到swift里面不仅有循环引用和弱引用(weak),还加入了无主引用(unowned),于是写了一些demo,这里总结一下。

和OC一样。Swfit默认也是基于ARC进行内存管理的,因此尽管简单,但假设不注意任然会出现循环引用问题(Retain cycle),导致内存泄露。

在OC中,能够非常easy的举出一个循环引用的样例。比方有两个类A和B,A中有一个属性是B类的实例,而B中又有一个属性是A类的实例。同一时候这两个属性都是strong的。这就导致了一个最简单的循环引用。

可是由于swift语法的特殊性。这种样例不像OC中一样easy构造。

由于对于一般类型的属性,Swfit要求在一个类的初始化方法中保证它一定有值。

这将导致一个死循环。

试想一下,A类在初始化的时候要保证它的某一个类型为B的属性先被初始化。而这个属性中又含有一个类型为A的属性须要先被初始化。

这样循环下去的后果是,没有不论什么一个A或者B类的对象能先被初始化。假设同意代码的话,能够编译,可是执行时会报错:“EXC_BAD_ACCESS”.

可是Swift这个特性并不意味着,在swift里面就不会出现引用循环问题了。

由于swift还提供了可选类型,这个类型能够不被赋值,默认值就是nil(这个nil表示没有赋值。而不表示不论什么详细的值,在OC中nil表示空指针)。

对于之前举得样例,仅仅要把属性设置为相应类的可选类型,一样会导致循环引用问题。

与OC相似,解决循环引用问题最简单方法就是把属性定义为weak。比方

class ClassA {
weak var classBInstance: ClassB?
init(){
//初始化操作
}
}

当弱引用所指向的对象被回收后,这个弱引用会自己主动被置为nil。

这一点和OC非常相似。因此也能够看到,由于nil是可选类型的特权,所以weak修饰符仅能修饰可选类型属性。

与OC不同的是,除了弱引用外。swift还提供了无主引用来打破引用循环。依据我们刚刚的讨论,导致循环引用的属性,至少有一个是可选类型。这也就是说。有可能在还有一个类里面。它的属性不是可选类型:

class ClassB {
unowned var classAInstance: ClassA = ClassA()
init(){
//初始化操作
}
}

比方在B类中,classAInstance这个属性就能够不是可选类型。在这种情况下,还能够使用无主引用来打破引用循环。语法就是把weak替换为unowned关键字。unowned属性引用的对象被回收后,引用不会被置为nil,也不能被訪问,否则会触发执行时错误。

总结一下就是:

  1. 和OC一样。Swift也是用ARC,也会有循环引用导致内存泄露
  2. 假设属性是可选类型。仅仅能用weak修饰符避免循环引用。所引用对象被回收后改属性会被自己主动置为nil
  3. 假设属性不是可选类型,仅仅能用无主引用(unowned)。所引用对象被回收后属性不会被置为nil,此时訪问会导致执行时错误。相似OC中的unsafe_unretained修饰符

附录

查看完整专栏——《Swift轻松入门》

【Swift入门(一)——基本的语法】

【Swift入门(二)——字符与字符串】

【Swift入门(三)——元组(Tuple)】

【Swift入门(四)——可选类型(Optionals)与断言(Assert)】

【Swift入门(五)——数组(Array)】

【Swift入门(六)——字典(Dictionary)】

【Swift入门(七)——结构体(Struct)】

【Swift入门(八)——功能强大的求余运算符】

【Swift入门(九)——String与Int、Double、Float等数字相互转换】

【Swift入门(十)——循环引用、弱引用和无主引用】

【Swift入门(十一)——类型转换与is、as操作】

【Swift入门(十二)——利用Extension加入逆序输出字符串方法】

Swift入门(十)——循环引用、弱引用和无主引用的更多相关文章

  1. Swift入门篇-循环语句

    今天早上一起来所有新闻都是报道荷兰5-1战胜西班牙,我一看没有搞错吧,顿时想都如果中国队vs荷兰队也不至于会输的怎么惨吧,难道是荷兰队开挂了,于是我看了一下昨天比赛的视频直播,还真是新闻报道的那样,顿 ...

  2. Swift 弱引用与无主引用

    前言 Swift 提供了两种解决循环引用的方法,弱引用和无主引用. 弱引用和无主引用可以使循环中的一个实例引用另一个实例时不使用强引用. 1.弱引用 对生命周期中会变为 nil 的实例采用弱引用,也就 ...

  3. Java四大引用详解:强引用、软引用、弱引用、虚引用

    面试官考察Java引用会问到强引用.弱引用.软引用.虚引用,具体有什么区别?本篇单独来详解 @mikechen Java引用 从JDK 1.2版本开始,对象的引用被划分为4种级别,从而使程序能更加灵活 ...

  4. 关于C语言中的强符号、弱符号、强引用和弱引用的一些陋见,欢迎指正

    首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑,所以写下此篇,希望能和同样 ...

  5. 浅谈C语言中的强符号、弱符号、强引用和弱引用

    摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014- ...

  6. Java -强引用&弱引用

    ⑴强引用(StrongReference) 就是通过new得的对象引用 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出OutOfMe ...

  7. Java 强引用 软引用 弱引用 虚引用详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt393 众所周知,java中是JVM负责内存的分配和回收,这是它的优点(使用方 ...

  8. java强引用 软引用 弱引用 虚引用

    https://www.cnblogs.com/yw-ah/p/5830458.html Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Objec ...

  9. java当中的强引用,软引用,弱引用,虚引用

    强引用,软引用,弱引用,虚引用:不同的引用类型主要体现在GC上 强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收.即使当前内存空间不足,JVM也不会回收它,而是抛出 OutOfMemoryEr ...

随机推荐

  1. Python爬虫-抖音小视频-mitmproxy与Appium

    目的:  爬取抖音小视频 工具:  mitmproxy.Appium 思路: 1.  通过 mitmproxy 截取请求, 找出 response 为 video 的请求. 2.  通过 mitmdu ...

  2. Vue编写轮播组件引入better-scroll插件无法正常循环轮播

    临近过年还是发个博客表示一下自己的存在感,这段时间公司突然说想搞小程序,想到这无比巨大的坑就只能掩面而泣,于是乎这段时间在学习小程序开发.关于标题所说的是有老铁问的,我也跟着网上的代码码了一遍然后发现 ...

  3. ArrayList练习之存储字符串并遍历

    在myArrayList项目下 新建一个包 在这个包中新建一个类:ArrayListDemo4.java ArrayListDemo4.java import java.util.ArrayList; ...

  4. Fiddler抓包工具手机添加代理后连不上网

    fiddler工具给手机设置代理之后,手机竟然上不了网了,尝试了N种解决方法,终于给解决了,因此,记录下来以备不时之需. 1.fiddler给手机添加代理 打开fiddler工具->Tools- ...

  5. CodeForces 20 A+B

                                               A - BerOS file system 水题不解释了,压缩斜杆.要注意最后没有斜杠. char a[105]; ...

  6. Codeforces603E - Pastoral Oddities

    Portal Description 初始时有\(n(n\leq10^5)\)个孤立的点,依次向图中加入\(m(m\leq3\times10^5)\)条带权无向边.使得图中每个点的度数均为奇数的边集是 ...

  7. 【状压DP】OpenJ_POJ - C17K Lying Island

    https://vjudge.net/contest/171652#problem/K [题意] 小岛上有n个人,有些是好人(一定是真话),有些是坏人(可能是真话也可能是假话),现在要判断最多有多少好 ...

  8. transient 关键字

    java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持.换句话来说就是,用transient关键字标记的成员变量不参与序列化过程.   作用 Jav ...

  9. mySQL windows 服务

    https://www.jizhuba.com/kejiyouxi/20171001/6006.html

  10. Python学习之-- IO 操作

    阻塞IO / 非阻塞IO /IO多路复用 / 异步IO 说明:同步IO包含(阻塞IO / 非阻塞IO /IO多路复用),因为他们有个共同特性就是都需要内核态到用户态的一个等待. 基本概念解释,环境限定 ...