如下定義Student肆饶,在構(gòu)造函數(shù)傳入閉包。假設(shè)這個(gè)類是已經(jīng)存在的驯镊,調(diào)用方無(wú)法修改;那調(diào)用時(shí)應(yīng)該注意避免循環(huán)引用
class Student{
private var doWork:(()->())
init(delegate: @escaping (()->())){
self.doWork = delegate
}
deinit {
print("deinit student")
}
}
Teacher內(nèi)部持有Student板惑,如果Student的構(gòu)造函數(shù)需要的閉包直接指向Teacher的成員方法,會(huì)發(fā)生循環(huán)引用
不應(yīng)該寫為
myStudent = Student(delegate:classBegin)
需要把classBegin放到一個(gè)weak self的閉包中被呼叫才能避免循環(huán)引用
class Teacher{
private func classBegin() {
print("hi, classmates!")
}
private var myStudent : Student?
func addStudent() {
//這樣寫無(wú)法釋放洒放,會(huì)內(nèi)存泄露
//myStudent = Student(delegate:classBegin)
myStudent = Student(delegate: {
[weak self] in
self?.classBegin()
})
}
deinit {
print("deinit teacher")
}
}