闭包循环引用问题:
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)
}