swift之闭包循环引用问题及解决方式

来源:互联网 发布:gm预测软件2007 编辑:程序博客网 时间:2024/04/28 01:23


闭包循环引用问题:

1.问题代码

代码1:viewcontroll

class ViewController: UIViewController {        var client: HTTPClient?            override func viewDidLoad() {        super.viewDidLoad()                //weak var weakSelf = self                let closure = {  (info info: String) -> () in                        print(info)            print(self.view)        }                client = HTTPClient()                client?.loadBigData(closure)                    }    deinit{        print("控制器 销毁")    }    }

代码2: 网络工具类httpclient

class HTTPClient: NSObject {        var callBack: ((info: String)->())?    func loadBigData(finish: (info:String) -> ()){        //获取闭包        callBack = finish                dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in             NSThread.sleepForTimeInterval(2)                        dispatch_async(dispatch_get_main_queue(), { () -> Void in                                self.dealData()                            })        }    }    //数据处理方法    func dealData(){        let str = "我是阳光的奇葩之都"        callBack?(info: str)    }        deinit{        print("网络请求类 销毁")    }}

细致观察:里面隐藏着一个循环引用链,导致controller 不能释放

关系是这样的   controller(强引用)->httpclient(强引用)->callback闭包(强引用)->self.view(即viewcontroller)  这样导致控制器不能释放

解决思路:将闭包callback对viewcontroller的强引用变成弱引用

修改后的代码

        weak var weakSelf = self                let closure = {  (info info: String) -> () in                        print(info)            print(weakSelf?.view)        }





1 0