弱代理变为nil。

5

在我的应用中,我使用代理来在数据准备好时读取它。

我从两个类中调用代理。以下是我的代码

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
    }
}

我正在从另一个类加载此方法。

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 方法被调用。

如果我让代理引用起来,它就可以正常工作。但这会导致内存泄漏。

那么,我该如何处理这种情况呢?


你在A和B中的前三行代码放在哪里?它们是否像代码片段中一样简单地放入类中?如果将它们移动到viewDidLoad中会发生什么? - Losiowaty
我可以知道这种情况的真正用途吗? - CodeChanger
编辑后,这三行代码应该放在某些方法中,而不是放在viewDidLoad方法中 @ Losiowaty - user7925427
1
我的使用情况是...我正在调用一个API并将数据保存到数据库中。根据需求,我可以从不同的屏幕调用该API。因此,我有一个类,在其中处理API请求并将数据保存到数据库中。在所有数据库查询之后...使用委托通知我的视图控制器数据已更新。这里我遇到了问题。 - user7925427
1
展示如何在 AB 上调用 testfunc - shallowThought
1个回答

5
您的delegate变量被声明为weak。如果没有任何东西保持对分配为代理(实现MyDelegate)的对象的强引用,那么当释放该对象时(例如在实例化它的作用域结束时),您的delegate将立即传递到nil
一些好的阅读材料:https://cocoacasts.com/how-to-break-a-strong-reference-cycle/

最好明确说明对象何时超出范围并被释放(即在 testFunc() 结束时),以及如何解决它(即添加一个类变量来存储 MyDelegateCalss)。 - Losiowaty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接