一、什么是循环引用、怎么发生的
循环引用就是当self 拥有一个block的时候,在block 又调用self的方法。形成你中有我,我中有你,谁都无法将谁释放的困局。
在oc中,通常解决block循环引用的办法就是weak来修饰self!
__weak typeof self (weakself) = self
swift中的闭包等于OC中的block,因此在使用闭包的时候也需要注意循环引用的问题
二、解决swift中闭包循环引用问题
1.类似block解决办法
weak var weakSelf = self
//解决循环引用 ,这里用var 而不用let
//因为weak可能在运行时被修改 ——》指向的对象一旦被释放,会被设为nil
GCDText { (data) in
//? 可选解包 , 对象为nil,不会向对象发送getter消息,更安全
//! 强行解包 ,如果对象为nil 会发生崩溃,一般用于对象接下来要进行计算
print(weakSelf?.view ?? UIView())
}
2.swift解决方法,推荐使用
GCDText {[weak self] (data) in
print(self?.view ?? UIView())
}
3.unowned;
GCDText { [unowned self](data) in
}
unowned