1. 什么时候会发生循环引用
- 原理跟oc中的block相似, 有强指针记住它, 就很容易强强引用导致无法释放对象, 导致内存泄漏, 发生莫名的错误..
2. 怎么解决循环引用
oc里面避免强强引用, 在使用到self的时候, 使用__weak来修饰self, 将self变为弱引用, 避免强强引用
swift里面有三种方法可以将强引用--`转换`-->弱引用
-
1 . 使用weak修饰变量, 打破强引用, 因为使用weak修饰的变量有一次变成nil的机会
-
2 . 使用[weak self] 修饰闭包原理跟__weak类似, 这样在闭包中使用self, 就是弱引用
-
3 . 使用[unowned self ] 修饰闭包, 跟__unsafe_unretained类似, 不安全, 不推荐使用
3. 示例代码
- 1 . weak
weak var weakSealf = self
- 2 . [weak self] 推荐使用
buttonView.clickBasisBtnBlock = {
// 用到强引用的时候在使用[weak self]修饰闭包对象
[weak self](clickButtonType:clickBasisBtnType)->Void in
self!.resignTextFieldResponder()
}
- 3 . [unowned self ] 不推荐使用
buttonView.clickBasisBtnBlock = {
// 不推荐使用
[unowned self ]()->Void in
self!.resignTextFieldResponder()
}