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

 

posted on 2019-07-10 11:18  二狗你变了  阅读(413)  评论(0编辑  收藏  举报

导航