1. class networkTool: NSObject {
  2.  
  3. //定义一个可选类型的闭包,用小括号()?括起闭包
  4. var finishedCallBack2:((_ jsonData:String)->())?
  5.  
  6. /*
  7. 模拟数据请求,定义一个闭包
  8. 闭包类型:(参数列表)->(返回值类型)
  9. @escaping 逃逸的,在非当前闭包内返回,需要使用@escaping
  10. */
  11. func loadData(_ finishedCallBack:@escaping (_ jsonData:String)->()) {
  12. self.finishedCallBack2=finishedCallBack
  13.  
  14. DispatchQueue.global().async {
  15. print("打印当期线程\(Thread.current)")
  16. DispatchQueue.main.sync {
  17. print("打印当期线程\(Thread.current)")
  18. finishedCallBack("json数据")
  19. }
  20. }
  21. }
  22. }
  1. class ViewController: UIViewController {
  2.  
  3. var tool:networkTool?
  4.  
  5. override func viewDidLoad() {
  6. super.viewDidLoad()
  7. tool=networkTool()
  8. }
  9.  
  10. @IBAction func onButtonAction0(_ sender: Any) {
  11. //解决循环引用方案一:
  12. //weak var weakSelf=self //使用weak变为弱引用
  13. weak var weakSelf:ViewController?=self //注意如果weakSelf指定类型,一定为可选类型,因为释放之后指向nil
  14.  
  15. tool?.loadData({ (jsonData:String) in
  16. print("请求到数据:\(jsonData)")
  17. weakSelf?.view.backgroundColor=UIColor.red
  18. })
  19. }
  20.  
  21. func onButtonAction2(_ sender: Any) {
  22. //解决循环引用方案二:使用[weak self] //推荐使用
  23. tool?.loadData({[weak self] (jsonData:String) in
  24. self?.view.backgroundColor=UIColor.red
  25. })
  26. }
  27.  
  28. func onButtonAction3(_ sender: Any) {
  29. //解决循环引用方案二:使用[unowned self] //不推荐使用,如果销毁,会产生野指针错误
  30. tool?.loadData({[unowned self] (jsonData:String) in
  31. self.view.backgroundColor=UIColor.red
  32. })
  33. }
  34.  
  35. //尾随闭包的写法(不建议)
  36. //如果在函数中,闭包是最后一个参数,那么可以写成尾随闭包
  37. @IBAction func onButtonAction(_ sender: Any) {
  38. /* //尾随闭包一
  39. tool?.loadData(){[weak self] (jsonData:String) in
  40. self?.view.backgroundColor=UIColor.red
  41. }
  42. */
  43.  
  44. //尾随闭包二
  45. //如果是唯一的参数,也可以将前面的()省略
  46. tool?.loadData{[weak self] (jsonData:String) in
  47. self?.view.backgroundColor=UIColor.red
  48. }
  49. }
  50.  
  51. deinit {
  52. print("viewController -- deinit")
  53. }
  54.  
  55. }

这是Swift的闭包中循环引用问题,同理OC中block的循环引用问题,请点击这里https://www.cnblogs.com/dhui69/p/11162125.html

Swift 闭包使用(循环引用...)的更多相关文章

  1. Swift 学习笔记 (解决Swift闭包中循环引用的三种方法)

    话不多说 直接上代码 class SmartAirConditioner { var temperature:Int = //类引用了函数 var temperatureChange:((Int)-& ...

  2. swift中闭包的循环引用

    首先我们先创造一个循环引用 var nameB:(()->())? override func viewDidLoad() { super.viewDidLoad() let bu = UIBu ...

  3. swift 学习之自动引用计数

    swift 学习之自动引用计数 学习和研究的主要是"实例对象和实例对象直接的相会强引用所产生的内从泄漏"和"使用闭包产生的强引用造成的内存泄漏" 注意:只有以引 ...

  4. swift 闭包循环引用

    当使用闭包时,类本身持有self,然后又在闭包中访问了self或者self的属性,就会导致恶心额循环引用.swift提供的解决方法是在闭包中定义捕获列表,捕获列表是闭包想怎么引用捕获来的变量.例如下面 ...

  5. swift闭包中解决循环引用的问题

    swift中可以通过三种方法解决循环引用的问题 利用类似oc方法解决循环引用weak var weakSelf = self weak var weakSelf = self loadData = { ...

  6. Swift 学习笔记 (三) 之循环引用浅析

    原创:转载请注明出处 110.自动引用计数实践 下面的例子展示了自动引用计数的工作机制.例子以一个简单的Person类开始,并定义了一个叫name的常量属性: class Person {     l ...

  7. swift详解之九---------------自动引用计数、循环引用

    自动引用计数.循环引用(这个必须理解,必须看) 注:本文详细介绍自动引用计数,以及各种循环引用问题.一网打尽! 1. 自动引用计数原理 Swift 使用ARC机制来跟踪和管理你的内存,一般情况下,Sw ...

  8. Swift入门(十)——循环引用、弱引用和无主引用

    近期看到swift里面不仅有循环引用和弱引用(weak),还加入了无主引用(unowned),于是写了一些demo,这里总结一下. 和OC一样.Swfit默认也是基于ARC进行内存管理的,因此尽管简单 ...

  9. Swift 循环引用

    - 循环引用的weak用法 // ** {} 中所有 self 都是弱引用,注意需要解包        // 1.类似于 OC 中的 __weak typeof(self) weakSelf = se ...

随机推荐

  1. Eclipse中创建新的SpringBoot项目(打包并且部署到tomcat)

    Spring-boot因为其对jar包的高度集成以及简化服务配置,快速部署等的优点,逐渐成为Java开发人员的热衷的框架.下面演示一下怎么在Eclipse中新建Spring-boot项目以及打包部署. ...

  2. 数据库事务ACID特效

    一.数据库事务正确执行的4个基础要素: 1.原子性 整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节.事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状 ...

  3. 远程服务器使用tensorboard

    1 .由于服务器上tensorboard使用的端口是6006,因此,连接ssh时,将服务器的6006端口重定向到自己机器上的16006端口: ssh -L 16006:127.0.0.1:6006 u ...

  4. java核心-多线程(6)-线程池-ThreadPoolExecutor

    1.java多线程编程少不了使用线程池,线程池相关的工具类所在jdk包,java.util.concurrent 2.使用示例 demo1 public class ThreadPoolDemo { ...

  5. k-近邻算法的优缺点及拓展思考

    //2019.08.03晚#k-近邻算法的拓展思考与总结1.k-近邻算法是一种非常典型的分类监督学习算法,它可以解决多分类的问题:另外,它的整体思想简单,效果强大.它也可以用来解决回归问题,使用的库函 ...

  6. vSphere 高级特性FT配置与管理

    内容预览: 1. Fault Tolerance 的工作方式 2. 5.X版本FT使用的vLockstep技术 3. 6.X版本FT使用的Fast Checkpointing技术 4. FT不支持的v ...

  7. numpy.linspace使用详解

    numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) 在指定的间隔内返回均匀间隔的数字. 返回nu ...

  8. python手动实现深拷贝

    深拷贝是将对象全拷贝,包括嵌套对象 def deepcopy(cls): if isinstance(cls, dict): dct = {} for k, v in cls.items(): dct ...

  9. Educational Codeforces Round 64 选做

    感觉这场比赛题目质量挺高(A 全场最佳),难度也不小.虽然 unr 后就懒得打了. A. Inscribed Figures 题意 给你若干个图形,每个图形为三角形.圆形或正方形,第 \(i\) 个图 ...

  10. 自己写个tween

    public Vector3 begin,end;//起始终止坐标 public float BtoE_time;//用时 float timer,lerp;//计时器和进度值 void Update ...