首先我们先创造一个循环引用

    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中闭包的循环引用相关推荐

  1. swift 引用其他类_浅谈swift中闭包修饰符 weak?unowned? 或什么都不用

    浅谈swift中闭包修饰符 weak?unowned? 或什么都不用 平常的开发中,clourse是我们iOSr绕不过去的坎儿. 苹果本身也很重视闭包,像之前的一些老的target-action类型的 ...

  2. 如何在'纯'Swift中创建弱协议引用(不带@objc)

    本文翻译自:How can I make a weak protocol reference in 'pure' Swift (without @objc) weak references don't ...

  3. nstimer循环引用_iOS中解决NSTimer循环引用问题

    NSTimer使用不当就会造成内存泄漏,比如常见的使用方法: //定义 @property (nonatomic, strong) NSTimer *timer; //实现 self.timer = ...

  4. java解决循环引用_Java 中如何避免循环引用,解决相互依赖的问题

    spring中通过依赖注入的方法来解决类的相互依赖问题!!! spring中通过依赖注入的方法来解决类的相互依赖问题!!! spring中通过依赖注入的方法来解决类的相互依赖问题!!! 只要不是构造函 ...

  5. nstimer循环引用_ios开发中经典循环引用场景?

    1.属性传值循环引用 如:- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexP ...

  6. Javascript 深度克隆中的循环引用问题解决和代码优化

    概要 在前端项目开发中,我们经常需要深度克隆JS对象.在克隆代码开发过程中,我们经常会遇到数组判定或对象循环引用的问题. 本文通过实例来解决上述问题 代码及实现 常见深度克隆JS对象的代码 funct ...

  7. swift_016(Swift 的闭包)

    //***********swift学习之16--闭包--*************************** /*   闭包(Closures) * 闭包是自包含的功能代码块,可以在代码中使用或者 ...

  8. iOS开发笔记(二):block循环引用

    写这篇文章的缘由是第一次面试时被问到了block循环引用的问题,当时回答的不是很好,首先要明确的是,block是否用copy修饰决定不了循环引用的产生,在此再一次进行补强,有不对的地方还请多多指教. ...

  9. 解决循环引用--弱引用weak_ptr

    循环引用:  引用计数是一种便利的内存管理机制,但它有一个很大的缺点,那就是不能管理循环引用的对象.一个简单的例子如下: class parent; class children;typedef sh ...

  10. Mybatis的循环引用

    Mybatis的循环引用 循环引用 数据准备 源码解析 总结 Mybatis中对循环引用及关联查询都做了很好的处理.博主觉得这块非常难.这里只是把我知道的讲出来. 循环引用 什么循环引用博主这里就不介 ...

最新文章

  1. php sqlsrv_query,sqlsrv_query
  2. 汉语(普通话)的音素对齐
  3. Fedora Core 4配置本地yum源
  4. Office365邮箱Imap迁移步骤
  5. Python中安装moveit_commander,顺带解决rospy模块未安装问题
  6. 窗体的Alpha通道透明色支持
  7. oracle修改表字段
  8. DI / CDI –基础
  9. python敏感字替换_python用类实现文章敏感词的过滤方法示例
  10. 第六十一期: 从7600万个5G连接中,我们发现了7种最有前景的5G物联网应用
  11. 【CodeForces - 255A】Greg's Workout (水题)
  12. 配置VRRP(虚拟路由器冗余协议)
  13. eclipse/myeclipse添加插件3种方式
  14. qt 控件坐标系_Qt中,如何找准控件坐标
  15. [转载] python中join的使用
  16. JavaWeb的Servlet、ServletContext
  17. SQL之EXISTS用法示例
  18. excel导入自定义单元格式yyyymd hmmss时间方法
  19. mysql生成随机中文名_MySQL-随机中文名
  20. 【锂电池】关于4.2V锂电池充电IC的一些记录

热门文章

  1. python人脸识别要怎么实现_详解如何用OpenCV + Python 实现人脸识别
  2. springboot + redis(单机版)
  3. HDU 2063 过山车
  4. 关于学习js的Promise的心得体会
  5. jmeter处理带表单的接口请求
  6. FCK添加远程图片自动下载
  7. 第四季-专题19-I2C驱动程序设计
  8. Linux 实现与宿主机共享文件夹 Centos7
  9. spring读取jdbc(file方式)
  10. 使用tomcat7-maven-plugin部署Web项目