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