swift中闭包的循环引用
首先我们先创造一个循环引用
var nameB:(()->())?
override func viewDidLoad() {
super.viewDidLoad()
let bu = UIButton(type: .ContactAdd) bu.addTarget(self, action: "tap", forControlEvents: .TouchUpInside)
view.addSubview(bu) run {
print("name")
self.view.backgroundColor = UIColor.greenColor()
}
} func tap() {
print("tap")
dismissViewControllerAnimated(true) { () -> Void in
print("dismissViewControllerAnimated")
}
} func run(name: ()->()) {
print("执行代码")
nameB = name
name()
} deinit {
print("deinit")
}
在代码中我们创建一个全局变量nameB, 然后我们在调用方法run的时候传入一个闭包, 在闭包里面我们用self.view...这样, 这包闭包就引用了self,
然后我们又在run 里面赋值给nameB这样就导致了, 这样控制器self又引用闭包, 所以就造成了循环引用
可以执行一下上面代码肯定不会走deint方法
要解决闭包的循环引用其实也不难, 我们在oc中解决循环引用使用weak修饰一个self, 在swift中也一样
weak var weakSelf = self
但要注意这里的weakSelf 就被包装成<optional>类型了, 所以在用的时候要强制解析
class viewController2: UIViewController {
var nameB:(()->())?
override func viewDidLoad() {
super.viewDidLoad()
let bu = UIButton(type: .ContactAdd)
bu.addTarget(self, action: "tap", forControlEvents: .TouchUpInside)
view.addSubview(bu)
weak var weakSelf = self
run {
print("name")
weakSelf!.view.backgroundColor = UIColor.greenColor()
}
}
func tap() {
print("tap")
dismissViewControllerAnimated(true) { () -> Void in
print("dismissViewControllerAnimated")
}
}
func run(name: ()->()) {
print("执行代码")
nameB = name
name()
}
deinit {
print("deinit")
}
}
这样就肯定会进deinit方法
其实闭包跟block很像, 如果想详细的了解block思想可以看看我总结的这个blog
http://www.cnblogs.com/MrTao/p/6824967.html
swift中闭包的循环引用的更多相关文章
- Swift 闭包使用(循环引用...)
class networkTool: NSObject { //定义一个可选类型的闭包,用小括号()?括起闭包 var finishedCallBack2:((_ jsonData:String)-& ...
- Swift中的for循环基本使用
OC中的for循环写法: ;i < ;i++) { NSLog(@"i=%zd",i); } Swift中的for循环写法: let a = ; ..< a { pri ...
- 初识Swift中的值和引用,循坏引用、代理的注意点
1.0 在Swift中分有值类型和引用类型 Int .String . 结构体和枚举都属于值类型, 将值类型传递给方法是,将在内存中创建其副本,并传递这个副本:这样我们就可以随心所欲修改它,而不用担心 ...
- Swift: 比较Swift中闭包传值、OC中的Block传值
一.介绍 开发者对匿名函数应该很清楚,其实它就是一个没有名字的函数或者方法,给人直观的感觉就是只能看到参数和返回值.在iOS开发中中,它又有自己的称呼,在OC中叫Block代码块,在Swift中叫闭包 ...
- block中如何避免循环引用
使用 weak–strong dance 技术 block 可以直接引用 self,但是要非常小心地在 block 中引用 self.因为在 block 引用 self,可能会导致循环引用.如下例所示 ...
- swift中闭包的学习。
在swift中的闭包等同于OC中的block,它的用途就是在于可以包装一段代码在必要的时候进行调用. 闭包定义: {(类型列表) -> 返回值 in // 多条swift语句 // 执行代码 ...
- 小解系列-自关联对象.Net MVC中 json序列化循环引用问题
自关联对象在实际开发中用的还是比较多,例如常见的树形菜单.本文是自己实际的一个小测试,可以解决循环引用对象的json序列化问题,文笔不好请多见谅,如有错误请指出,希望有更好的解决方案,一起进步. 构造 ...
- Cocos2D在新版Swift中常量枚举值引用代码的修改
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们知道在SpriteBuilder中是无法直接给一个CCB文 ...
- JavaScript 中的 for 循环---------------引用
在ECMAScript5(简称 ES5)中,有三种 for 循环,分别是: 简单for循环 for-in forEach 下面先来看看大家最常见的一种写法: 当数组长度在循环过程中不会改变时,我们应将 ...
随机推荐
- bzoj 3217: ALOEXT
将此神题作为博客园的第一篇文章,至此,数据结构基本学完了(或者说数据结构轮流虐了我一次!) 人生第一道7K代码题! 没什么,就是treap套个trie,然后tle是因为一定要用指针当时p党谁会用那么丑 ...
- POJ2135:Farm Tour——题解
http://poj.org/problem?id=2135 题目大意: 从1到n再回来,每条边只能走一次,问最短路. —————————————————— 如果不告诉我是费用流打死不会想这个…… 我 ...
- BZOJ4516:[SDOI2016]生成魔咒——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4516 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一 ...
- 那些常用的JS命令
window.location.reload()刷新当前页面. parent.location.reload()刷新父亲对象(用于框架) opener.location.reload()刷新父窗口对象 ...
- Codeforces Round #343 (Div. 2) B
B. Far Relative’s Problem time limit per test 2 seconds memory limit per test 256 megabytes input st ...
- HDU2841 (队列容斥)
Visible TreesTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- mysql的cast()函数
先来补个知识: decimal的用法: decimal(18,4)总长18位,包括1位小数点和4为小数,也就是说18-1-4=13整数位只有13位decimal(19,1)总长19位,17位整数,1位 ...
- sql获取当前时间
sql读取系统日期和时间的方法如下:--获取当前日期(如:yyyymmdd) select CONVERT (nvarchar(12),GETDATE(),112) --获取当前日期(如:yyyymm ...
- 查看mysql binlog日志
1.使用show binlog events a.获取binlog文件列表 mysql> show binary logs; +------------------+-----------+ | ...
- 可能是国内最火的开源项目 —— C/C++ 篇
程序员们,在北上广你还能买房吗? >>> 推荐阅读: 可能是最火的开源项目 -- Java 篇 可能是国内最火的开源项目 -- PHP 篇 可能是国内最火的开源项目 -- Pyt ...