循环引用的产生原因:两个对象互相之间强引用,导致互相不能释放,后果就是两个对象都不释放,导致两个对象的内存都不能释放,这就会产生所谓的内存泄露。
Swift闭包循环引用产生的两个条件
1.对象对闭包强引用,即闭包是对象的属性。
2.闭包中对对象强引用,闭包对闭包中的成员变量都会强引用一次。Student的实例对printNum闭包强引用,闭包中又对self进行了强引用。
class Student {
let num:Int
init(studentNum:Int) {
num = studentNum
printNum = {
print(self.num)
}
}
var printNum:(()->())
deinit {
print("deinit student")
}
}
解决方案
1.使用weak 或者 unowned 对self进行弱引用修饰,在闭包中使用弱引用后的self。区别在于前者得到的是可选,后者不是。
printNum = {[weak self] in
print(self?.num)
}
printNum = {[unowned self] in
print(self.num)
}
2.在闭包中不对self进行引用,直接引用我们需要引用的值。
printNum ={[num] in
print(num)
}