在我的应用程序中,我正在使用代理,以便我可以在数据准备就绪时读取数据。
我正在调用两个班级的代表。这是我的代码
protocol MyDelegate: class {
func getData()
}
class MyDelegateCalss {
weak var delegate: MyDelegate?
func loadData() {
// doing some actions
if(self.delegate != nil){
self.delegate!.getData!()
}
}
}
在一个类中,我在tableview numberOfSections委托方法中加载此方法。
class A: UIViewController, MyDelegate {
func somefunc(){
let mydelegatecls : MyDelegateCalss = MyDelegateCalss()
mydelegatecls.delegate = self
mydelegatecls.loadData()
}
func getData(){
// Doing some actions
}
}
这个方法我从另一个calss加载。
class B: UIViewController, MyDelegate {
open func testfunc(){
let mydelegatecls : MyDelegateCalss = MyDelegateCalss()
mydelegatecls.delegate = self
mydelegatecls.loadData()
}
func getData(){
// doing some other stuff
}
}
class C: UIViewController {
func testfunc(){
let b : B = B()
b.testfunc()
}
}
这里来自A班,我的代表工作正常。我能看到getData方法正在调用。
来自B类的,委托变为nil,无法看到getData方法被称为
如果我让委托引用工作正常。但那会导致内存泄漏。
如何处理这种情况?
答案 0 :(得分:4)
您的delegate
var声明为weak
。如果没有任何内容保留对您指定为委托的对象的强引用(实现MyDelegate
),则只要对象被释放,您的delegate
就会传递给nil
(例如,结束实例化它的范围。)
好读:https://cocoacasts.com/how-to-break-a-strong-reference-cycle/