zoukankan      html  css  js  c++  java
  • Swift 闭包使用(循环引用...)

    class networkTool: NSObject {
        
        //定义一个可选类型的闭包,用小括号()?括起闭包
        var finishedCallBack2:((_ jsonData:String)->())?
        
        
       /*
        模拟数据请求,定义一个闭包
        闭包类型:(参数列表)->(返回值类型)
        @escaping 逃逸的,在非当前闭包内返回,需要使用@escaping
       */
        func loadData(_ finishedCallBack:@escaping (_ jsonData:String)->()) {
            self.finishedCallBack2=finishedCallBack
            
            DispatchQueue.global().async {
                print("打印当期线程(Thread.current)")
                DispatchQueue.main.sync {
                    print("打印当期线程(Thread.current)")
                    finishedCallBack("json数据")
                }
            }
        }
    }
    class ViewController: UIViewController {
    
        var tool:networkTool?
        
        override func viewDidLoad() {
            super.viewDidLoad()
            tool=networkTool()
        }
        
        @IBAction func onButtonAction0(_ sender: Any) {
            //解决循环引用方案一:
            //weak var weakSelf=self //使用weak变为弱引用
            weak var weakSelf:ViewController?=self //注意如果weakSelf指定类型,一定为可选类型,因为释放之后指向nil
            
            tool?.loadData({ (jsonData:String) in
                print("请求到数据:(jsonData)")
                weakSelf?.view.backgroundColor=UIColor.red
            })
        }
        
        func onButtonAction2(_ sender: Any) {
            //解决循环引用方案二:使用[weak self] //推荐使用
            tool?.loadData({[weak self] (jsonData:String) in
                self?.view.backgroundColor=UIColor.red
            })
        }
        
        func onButtonAction3(_ sender: Any) {
            //解决循环引用方案二:使用[unowned self] //不推荐使用,如果销毁,会产生野指针错误
            tool?.loadData({[unowned self] (jsonData:String) in
                self.view.backgroundColor=UIColor.red
            })
        }
        
        //尾随闭包的写法(不建议)
        //如果在函数中,闭包是最后一个参数,那么可以写成尾随闭包
        @IBAction func onButtonAction(_ sender: Any) {
          /* //尾随闭包一
            tool?.loadData(){[weak self] (jsonData:String) in
                self?.view.backgroundColor=UIColor.red
            }
           */
            
            //尾随闭包二
            //如果是唯一的参数,也可以将前面的()省略
            tool?.loadData{[weak self] (jsonData:String) in
                self?.view.backgroundColor=UIColor.red
            }
        }
        
        deinit {
            print("viewController -- deinit")
        }
    
    }

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

  • 相关阅读:
    Spring中Quartz的配置
    通用表格打印1
    使用Lucene.Net实现全文检索
    DIV CSS 网页兼容全搞定 (IE6 IE7 IE8 IE9 火狐 谷歌)
    Code128 条码生成
    URL参数Base64解密和解密
    JQuery EasyUI 中文API
    linux 下mysql命令 (授权用户 和 基本操作)
    python操作MySQL数据库
    GridView分组,统计,排序的解决方案
  • 原文地址:https://www.cnblogs.com/dhui69/p/11162705.html
Copyright © 2011-2022 走看看