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化之后,或者用户在一个页面停 ...
随机推荐
- VMware Workstation9安装Mac OS X10.9系统
链接地址:http://jingyan.baidu.com/article/aa6a2c142cef740d4c19c426.html VMware Workstation9.0安装Mac OS X1 ...
- javascript 学习随笔6
改变html内容 document.getElementById("p1").innerHTML="New text!"; var element=docume ...
- 我的Python成长之路---第三天---Python基础(11)---2016年1月16日(雾霾)
三.深浅拷贝 在Python中将一个变量的值传递给另外一个变量通常有三种:赋值.浅拷贝以及深拷贝 讨论深浅拷贝之前我们把Python的数据类型分为基本数据类型包括数字.字符串.布尔以及None等,还有 ...
- C++ cout 如何保留小数输出
参考 : http://upliu.net/how-cout-out-2-precision.html 大家都知道用 C 语言中 printf () 函数可以非常方便控制保留 几位小数输出 不过在 C ...
- BNU 4067 求圆并
好久没写过单组数据的题目了 QAQ 赤裸裸的模板题 #include <cstdio> #include <cstring> #include <iostream> ...
- 在线QQ客服
代码一: <a target="_blank" href="http://wpa.qq.com/msgrd?v=3&uin=451314789&si ...
- Week6(10月17日):周末别忘记运动
Part I:提问 =========================== 1.多对多.一对多关系的数据实体模型,如何创建? 已知汽车4S店需开发一个客户关系管理系统(CRM),请为其中的客户和汽车 ...
- 我也来说说C#中的异步:async/await
序 最近看了一些园友们写的有关于异步的文章,受益匪浅,写这篇文章的目的是想把自己之前看到的文章做一个总结,同时也希望通过更加通俗易懂的语言让大家了解"异步"编程. 1:什么是异步 ...
- php下载远程图片方法总结(curl手动解析header)curl跳转问题解决
常用方法一般有:. file_get_contents file_put_contents readfile($file) //效率很高. 一般代码: /** * 抓取远程图片 * * @param ...
- python爬虫实战2百度贴吧爬html
转自:http://blog.csdn.net/wxg694175346/article/details/8927832 import string, urllib2 #定义百度函数 def baid ...