Swift入门(十)——循环引用、弱引用和无主引用
近期看到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,也不能被訪问,否则会触发执行时错误。
总结一下就是:
- 和OC一样。Swift也是用ARC,也会有循环引用导致内存泄露
- 假设属性是可选类型。仅仅能用weak修饰符避免循环引用。所引用对象被回收后改属性会被自己主动置为nil
- 假设属性不是可选类型,仅仅能用无主引用(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入门(十)——循环引用、弱引用和无主引用的更多相关文章
- Swift入门篇-循环语句
今天早上一起来所有新闻都是报道荷兰5-1战胜西班牙,我一看没有搞错吧,顿时想都如果中国队vs荷兰队也不至于会输的怎么惨吧,难道是荷兰队开挂了,于是我看了一下昨天比赛的视频直播,还真是新闻报道的那样,顿 ...
- Swift 弱引用与无主引用
前言 Swift 提供了两种解决循环引用的方法,弱引用和无主引用. 弱引用和无主引用可以使循环中的一个实例引用另一个实例时不使用强引用. 1.弱引用 对生命周期中会变为 nil 的实例采用弱引用,也就 ...
- Java四大引用详解:强引用、软引用、弱引用、虚引用
面试官考察Java引用会问到强引用.弱引用.软引用.虚引用,具体有什么区别?本篇单独来详解 @mikechen Java引用 从JDK 1.2版本开始,对象的引用被划分为4种级别,从而使程序能更加灵活 ...
- 关于C语言中的强符号、弱符号、强引用和弱引用的一些陋见,欢迎指正
首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑,所以写下此篇,希望能和同样 ...
- 浅谈C语言中的强符号、弱符号、强引用和弱引用
摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014- ...
- Java -强引用&弱引用
⑴强引用(StrongReference) 就是通过new得的对象引用 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出OutOfMe ...
- Java 强引用 软引用 弱引用 虚引用详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt393 众所周知,java中是JVM负责内存的分配和回收,这是它的优点(使用方 ...
- java强引用 软引用 弱引用 虚引用
https://www.cnblogs.com/yw-ah/p/5830458.html Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Objec ...
- java当中的强引用,软引用,弱引用,虚引用
强引用,软引用,弱引用,虚引用:不同的引用类型主要体现在GC上 强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收.即使当前内存空间不足,JVM也不会回收它,而是抛出 OutOfMemoryEr ...
随机推荐
- python全套视频十五期(116G)
python全套视频,第十五期,从入门到精通,基础班,就业班,面试,软件包 所属网站分类: 资源下载 > python视频教程 作者:精灵 链接:http://www.pythonheidong ...
- 使用solrJ创建索引
sorlJ官方介绍谷歌翻译 SolrJ是一个API,可以让Java应用程序轻松与Solr对话. SolrJ隐藏了很多连接到Solr的细节,并允许您的应用程序通过简单的高级方法与Solr进行交互. p ...
- python 数据库操作产生中文乱码的解决办法
1.执行python mysql数据库查询操作时,产生中文乱码 #!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb db = MySQLd ...
- C#与Ranorex自动化公用方法
原创 - C#与Ranorex自动化公用方法 利用c#在Ranorex上写自动化已经有很长的一段时间了,总结发现常用的方法不外乎如下几种: 1.打开浏览器:或者app public static vo ...
- 《Shell脚本学习指南》书籍目录
摘要:Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的.但是它比Windows下的批处理更 ...
- 七牛云成功通过 CMMI3 认证
10 月 31 日,在上海七牛信息技术有限公司青岛会议室举行的 CMMI3 级认证结果发布会上,主任评估师王庆付老师和评估组向公司高层及参与评审的 EPG 成员及项目组成员郑重宣布:经过严格的现场审核 ...
- asp.net 引发类型为“System.OutOfMemoryException”的异常
asp.net 引发类型为“System.OutOfMemoryException”的异常通常发生在IIS进程获取不到内存时. 临时解决方法是: 回收IIS的应用程序池. 如果要比较好的解决办法是: ...
- 应对ADT(Eclipse)的No more handles解决办法
应对ADT(Eclipse)的No more handles解决方法 ADT(Eclipse)最近几天经常出现如下错误对话框:org.eclipse.swt.SWTError: No more han ...
- 怎样检查Android网络连接状态
在发送任何HTTP请求前最好检查下网络连接状态,这样可以避免异常.这个教程将会介绍怎样在你的应用中检测网络连接状态. 创建新的项目 1.在Eclipse IDE中创建一个新的项目并把填入必须的信息. ...
- Shell脚本的编写,sed的使用以及一些正则表达式
Shell脚本的简单编写以及sed的使用 标签(空格分隔): 博客文章 前一阵子为了批量修改Web审计规则,故编写了一个Shell脚本,顺便使用了下sed,顺便把正则表达式也重新学习一遍,感觉还是需要 ...