2017-04-26 91 views
6

在我的应用程序中,我使用委托,以便可以在数据准备就绪时读取数据。弱代表变为零

我打电话给两个班级的代表。这里是我的代码

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类,如果我做了委托引用其做工精细委托变成零,无法看到GetData方法被调用

。但是这会导致内存泄漏。

如何处理这种情况?

+0

你在哪里有A和B的前3行?它们是否像代码片段一样简单地放入类中?如果将它们移动到'viewDidLoad',会发生什么? – Losiowaty

+0

我可以知道这种情况下真正的用例是什么? – CodeChanger

+0

编辑..这3行是在一些方法..不在viewDidLoad @ Losiowaty – Sarah

回答

3

您的delegate var声明为weak。如果没有任何关于您作为代理分配的对象的强大参考(实施MyDelegate),则只要对象被释放(例如,实例化它的作用域的末尾),您的delegate就会传递到nil

一些良好的阅读:https://cocoacasts.com/how-to-break-a-strong-reference-cycle/

+0

明确地提及对象超出范围并被释放(即在'testFunc()')的末尾以及如何解决它(即添加一个类变量来存储'MyDelegateCalss') – Losiowaty