Swift - 内存泄露原因(循环强引用)及解决办法
Swift使用自动引用计数(ARC)来管理应用程序的内存使用。在大多是情况下,并不需要考虑内存的管理。当实例不再需要的时候,ARC会自动释放这些实例所使用的内存。
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
 | 
class Teacher {    var tName : String    var student : Student?         init(name:String){        tName = name        println("老师\(tName)实例初始化完成")    }         deinit{        println("老师\(tName)实例反初始化完成")    }}class Student {    var sName : String    var teacher : Teacher?         init(name:String){        sName = name        println("学生\(sName)实例初始化完成")    }         deinit{        println("学生\(sName)实例反初始化完成")    }}//测试开始var teacher:Teacher?var student:Student?teacher = Teacher(name: "李老师")student = Student(name: "刘同学")teacher!.student = studentstudent!.teacher = teacher        teacher = nilstudent = nil//测试结果(deinit未调用,则内存泄露)老师李老师实例初始化完成学生刘同学实例初始化完成 | 
解决办法:使用弱引用
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
 | 
class Teacher {    var tName : String    weak var student : Student?         init(name:String){        tName = name        println("老师\(tName)实例初始化完成")    }         deinit{        println("老师\(tName)实例反初始化完成")    }}class Student {    var sName : String    var teacher : Teacher?         init(name:String){        sName = name        println("学生\(sName)实例初始化完成")    }         deinit{        println("学生\(sName)实例反初始化完成")    }} | 
2,闭包引起的循环强引用
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
 | 
class JsonElement{    let name:String    let jValue:String?         lazy var asJson:() -> String = {        if let text = self.jValue {            return "\(self.name):\(text)"        }else{            return "text is nil"        }    }         init(name:String, text:String){        self.name = name        self.jValue = text        println("初始化闭包")    }         deinit{        println("闭包释放")    }}//开始测试var p:JsonElement? = JsonElement(name: "p", text: "hangge.com")println(p!.asJson())p = nil//测试结果(deinit未调用,则内存泄露)初始化闭包p:hangge.com | 
解决办法:使用闭包捕获列表
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
 | 
class JsonElement{    let name:String    let jValue:String?         lazy var asJson:() -> String = {        [unowned self] in //使用无主引用来解决强引用循环        if let text = self.jValue {            return "\(self.name):\(text)"        }else{            return "text is nil"        }    }         init(name:String, text:String){        self.name = name        self.jValue = text        println("初始化闭包")    }         deinit{        println("闭包释放")    }} | 
Swift - 内存泄露原因(循环强引用)及解决办法的更多相关文章
- 使用gc、objgraph干掉python内存泄露与循环引用!
		
Python使用引用计数和垃圾回收来做内存管理,前面也写过一遍文章<Python内存优化>,介绍了在python中,如何profile内存使用情况,并做出相应的优化.本文介绍两个更致命的问 ...
 - .Net内存泄露原因及解决办法
		
.Net内存泄露原因及解决办法 1. 什么是.Net内存泄露 (1).NET 应用程序中的内存 您大概已经知道,.NET 应用程序中要使用多种类型的内存,包括:堆栈.非托管堆和托管堆.这里我们需 ...
 - 解决Net内存泄露原因
		
Net内存泄露原因及解决办法 https://blog.csdn.net/changtianshuiyue/article/details/52443821 什么是.Net内存泄露 (1).NET 应 ...
 - 常见的Java Script内存泄露原因及解决方案
		
前言 内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存.内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了 ...
 - Swift-08-闭包引起的循环强引用
		
循环强引用还会发生在当你将一个闭包赋值给类实例的某个实例,并且这个闭包体中又实用了这个类实例.这个闭包体重可能访问了实例的某个属性,例如self.**,或者闭包中调用了实例的某个方法,例如self.* ...
 - C#项目间循环引用的解决办法,有图有真相
		
C#项目间循环引用的解决办法,有图有真相 程序间的互相调用接口,c#禁止互相引用,海宏软件,20160315 /// c#禁止互相引用,如果项目[订单]中有一个orderEdit单元,要在项目[进销存 ...
 - ubuntu安装vim时提示 没有可用的软件包 vim,但是它被其它的软件包引用了 解决办法
		
ubuntu安装vim时提示 没有可用的软件包 vim-gtk3,但是它被其它的软件包引用了 解决办法 本人在ubuntu系统安装vim 输入 sudo apt-get install vim 提示 ...
 - eclipse项目中关于导入的项目里提示HttpServletRequest 不能引用的解决办法
		
eclipse项目中关于导入的项目里提示HttpServletRequest 不能引用的解决办法 当使用eclipse导入外部的web工程时,有时会提示HttpServletRequest, Serv ...
 - [ Javascript ] 内存泄露以及循环引用解析
		
内存泄露 在javascript中,我们非常少去关注内存的管理. 我们创建变量,使用变量,浏览器关注这些底层的细节都显得非常正常. 可是当应用程序变得越来越复杂而且ajax化之后,或者用户在一个页面停 ...
 
随机推荐
- C++,对象的 =赋值 以及 复制构造函数赋值
			
1. C++默认实现了 = 号赋值:operator=只要将一个对象的内容的内容逐位复制给另外一个对象即可. 2. C++默认实现了复制构造函数:同样,只要将一个对象的内容的内容逐位复制给另外一个对象 ...
 - BZOJ 2134: 单选错位( 期望 )
			
第i个填到第i+1个的期望得分显然是1/max(a[i],a[i+1]).根据期望的线性性, 我们只需将每个选项的期望值累加即可. ---------------------------------- ...
 - eclipse the user operation is waiting for building workspace" to complete
			
"the user operation is waiting for building workspace" to complete", 解决办法: 1.选择菜单栏的“P ...
 - Tomcat 常规配置并通过zabbix 监控 jvm状态
			
一:jdk和tomcat基础 apache有两种方式运行php,一是使用模块,二是使用fastcgi nginx也可以通过fastcgi处理动态请求,也可以转发至tomcat tomcat监控主要是监 ...
 - HDU 5025Saving Tang Monk BFS + 二进制枚举状态
			
3A的题目,第一次TLE,是因为一次BFS起点到终点状态太多爆掉了时间. 第二次WA,是因为没有枚举蛇的状态. 解体思路: 因为蛇的数目是小于5只的,那就首先枚举是否杀死每只蛇即可. 然后多次BFS, ...
 - java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.MethodNode(尼玛,蛋疼的错误)
			
java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.MethodNode \-[M ...
 - WeCenter 社交化问答社区程序 | WeCenter 是一款知识型的社交化问答社区程序,专注于社区内容的整理、归类、检索和再发行
			
WeCenter 社交化问答社区程序 | WeCenter 是一款知识型的社交化问答社区程序,专注于社区内容的整理.归类.检索和再发行 为什么选择 WeCenter 程序? 让您的社区更智能地运作,强 ...
 - BZOJ 3196: Tyvj 1730 二逼平衡树( 树套树 )
			
这道题做法应该很多吧.... 我用了线段树套treap.... -------------------------------------------------------------------- ...
 - nginx提示:500 Internal Server Error错误的解决方法
			
现在越来越多的站点开始用 Nginx ,("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 ...
 - ZOJ3768 夹逼查找【STL__lower_bound()_的应用】
			
首先学习一下lower_bound() 函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置.如果所有元素都小于val,则返回last ...