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 ...
随机推荐
- pwnable.kr uaf之wp
几乎都想要放弃了,感觉学了好久还是什么都不会,这个题好像很难的样子,有很多知识点需要补充一下: 1.[UAF]分配的内存释放后,指针没有因为内存释放而变为NULL,而是继续指向已经释放的内存.攻击者可 ...
- ES6(对象扩展)
ES6(对象(object)新增特性) 1.简介表示法 o,k 为属性:这种为无方法的情况. 这种为有方法. 2.属性表达式 ES6中,[a]就是 b . 3.新增API 1.数组也是引用类型 2.O ...
- iis性能监控
文章:对于IIS上的应用程序池监控 文章:IIS并发连接数及性能优化
- HDU 1102 Kruscal算法
题目大意:给定村庄的数量,和一个矩阵表示每个村庄到对应村庄的距离,矩阵主对角线上均为1 在给定一个数目Q,输入Q行之间已经有通道的a,b 计算还要至少修建多少长度的轨道 这道题目用Kruscal方法进 ...
- 【组合 数学】codeforces C. Do you want a date?
codeforces.com/contest/810/problem/C [题意] 给定一个集合A,求 , 输入: [思路] 基数为n的集合有2^n-1个非空子集. 首先n个数要从小到大排序,枚举最后 ...
- JavaBean映射工具dozer学习
阅读更多 转载自http://lishaorui.iteye.com/blog/1151513 1.简介 dozer是一种JavaBean的映射工具,类似于apache的BeanUtils.但 ...
- spring几种依赖注入方式以及ref-local/bean,factory-bean,factory-method区别联系
平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...
- 12.3——类作用域,构造函数,友元,static类成员
类作用域: (1)成员函数在类外定义时,因为函数体还有形参列表都出现在成员名之后,都是在类作用域内定义,所以不用加域作用符 来引用其他的成员. (2)函数的返回值不一定需要在类的作用域中,但是若是返回 ...
- codeforces 1041 c 乱搞
#include <bits/stdc++.h> using namespace std; struct po { int val; int id; }; po a[]; vector&l ...
- 洛谷—— P1536 村村通
P1536 村村通 题目描述 某市调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.市政府“村村通工程”的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接的道路相连, ...