近期看到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. 《算法导论》 — Chapter 10 基本数据结构

    序 在本章中,要讨论如何通过使用了指针的简单数据结构表示动态集合.有很多的复杂的数据结构可以用指针来构造,本章介绍几种基本数据结构,包括栈.队列.链表,以及有根树. GitHub 第十章 程序实现代码 ...

  2. Sql按照字段分组,选取其他字段最值所在的行记录

    引言: 为什么会引入这个问题,在程序中遇到这样的问题,在某个数据表中,相同的AID(项目ID)被多次添加到数据表中,所以对应于不同的时间,只想选取添加时间最早的哪一条记录. 参考:红黑联盟 所用到的数 ...

  3. 2. TypeScript笔记

    1. 安装node.js之后 需要测试npm命令 2.命令正常安装TypeScript 3.安装Egret egret 命令

  4. 数列分块入门1~9 loj6277~6285

    hzwer的讲解 一 给出一个长为 \(n\) 的数列,以及 \(n\) 个操作,操作涉及区间加法,单点查值. #include <iostream> #include <cstdi ...

  5. 自动化项目配置或用例文件格式推荐--yaml

    关于yaml YAML语言的设计目标,就是方便人类读写.如果你想要实现一些用ini不好做到的配置,可以使用yaml格式作为配置文件 大小写敏感 使用缩进表示层级关系 缩进时不允许使用Tab键,只允许使 ...

  6. Flask--登录检查(简单篇)---xunfeng巡风实例篇

    如果session返回的是loginsuccess,那么通过redirect直接跳转到执行的页面或者view. 同时通过装饰器的形式.. # -*- coding: UTF-8 -*- from fu ...

  7. 什么样的经历,才能领悟成为架构师? >>>

    什么样的经历,才能领悟成为架构师? >>> 本文主要分析 SpringBoot 的启动过程. SpringBoot的版本为:2.1.0 release,最新版本. 一.时序图 还是老 ...

  8. hdu 2181暴搜

    #include<stdio.h> #include<string.h> #define N 30 int map[N][4],total; void dfs(int n,in ...

  9. 异常处理(try catch throw)详解(C++)

    选择异常处理的编程方法的具体原因如下: 1.把错误处理和真正的工作分开来: 2.代码更易组织,更清晰,复杂的工作任务更容易实现: 3.毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了: 4 ...

  10. freeswitch三方通话配置

    此种方法能实现,其中默认转移后按0,可进入三方通话. 用transfer只能实现代接转移. Misc. Dialplan Tools att xfer From FreeSWITCH Wiki Jum ...