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 inprint("dismissViewControllerAnimated")}}func run(name: ()->()) {print("执行代码")nameB = namename()}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 = selfrun {print("name")weakSelf!.view.backgroundColor = UIColor.greenColor()}}func tap() {print("tap")dismissViewControllerAnimated(true) { () -> Void inprint("dismissViewControllerAnimated")}}func run(name: ()->()) {print("执行代码")nameB = namename()}deinit {print("deinit")} }
这样就肯定会进deinit方法
其实闭包跟block很像, 如果想详细的了解block思想可以看看我总结的这个blog
http://www.cnblogs.com/MrTao/p/6824967.html
转载于:https://www.cnblogs.com/MrTao/p/5290088.html
swift中闭包的循环引用相关推荐
- swift 引用其他类_浅谈swift中闭包修饰符 weak?unowned? 或什么都不用
浅谈swift中闭包修饰符 weak?unowned? 或什么都不用 平常的开发中,clourse是我们iOSr绕不过去的坎儿. 苹果本身也很重视闭包,像之前的一些老的target-action类型的 ...
- 如何在'纯'Swift中创建弱协议引用(不带@objc)
本文翻译自:How can I make a weak protocol reference in 'pure' Swift (without @objc) weak references don't ...
- nstimer循环引用_iOS中解决NSTimer循环引用问题
NSTimer使用不当就会造成内存泄漏,比如常见的使用方法: //定义 @property (nonatomic, strong) NSTimer *timer; //实现 self.timer = ...
- java解决循环引用_Java 中如何避免循环引用,解决相互依赖的问题
spring中通过依赖注入的方法来解决类的相互依赖问题!!! spring中通过依赖注入的方法来解决类的相互依赖问题!!! spring中通过依赖注入的方法来解决类的相互依赖问题!!! 只要不是构造函 ...
- nstimer循环引用_ios开发中经典循环引用场景?
1.属性传值循环引用 如:- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexP ...
- Javascript 深度克隆中的循环引用问题解决和代码优化
概要 在前端项目开发中,我们经常需要深度克隆JS对象.在克隆代码开发过程中,我们经常会遇到数组判定或对象循环引用的问题. 本文通过实例来解决上述问题 代码及实现 常见深度克隆JS对象的代码 funct ...
- swift_016(Swift 的闭包)
//***********swift学习之16--闭包--*************************** /* 闭包(Closures) * 闭包是自包含的功能代码块,可以在代码中使用或者 ...
- iOS开发笔记(二):block循环引用
写这篇文章的缘由是第一次面试时被问到了block循环引用的问题,当时回答的不是很好,首先要明确的是,block是否用copy修饰决定不了循环引用的产生,在此再一次进行补强,有不对的地方还请多多指教. ...
- 解决循环引用--弱引用weak_ptr
循环引用: 引用计数是一种便利的内存管理机制,但它有一个很大的缺点,那就是不能管理循环引用的对象.一个简单的例子如下: class parent; class children;typedef sh ...
- Mybatis的循环引用
Mybatis的循环引用 循环引用 数据准备 源码解析 总结 Mybatis中对循环引用及关联查询都做了很好的处理.博主觉得这块非常难.这里只是把我知道的讲出来. 循环引用 什么循环引用博主这里就不介 ...
最新文章
- php sqlsrv_query,sqlsrv_query
- 汉语(普通话)的音素对齐
- Fedora Core 4配置本地yum源
- Office365邮箱Imap迁移步骤
- Python中安装moveit_commander,顺带解决rospy模块未安装问题
- 窗体的Alpha通道透明色支持
- oracle修改表字段
- DI / CDI –基础
- python敏感字替换_python用类实现文章敏感词的过滤方法示例
- 第六十一期: 从7600万个5G连接中,我们发现了7种最有前景的5G物联网应用
- 【CodeForces - 255A】Greg's Workout (水题)
- 配置VRRP(虚拟路由器冗余协议)
- eclipse/myeclipse添加插件3种方式
- qt 控件坐标系_Qt中,如何找准控件坐标
- [转载] python中join的使用
- JavaWeb的Servlet、ServletContext
- SQL之EXISTS用法示例
- excel导入自定义单元格式yyyymd hmmss时间方法
- mysql生成随机中文名_MySQL-随机中文名
- 【锂电池】关于4.2V锂电池充电IC的一些记录