首页 > 解决方案 > 通过协议传递自我会导致内存泄漏吗?

问题描述

我很难理解这个

假设我有一个自定义视图,其中包含另一个类(视图控制器)使用的协议

protocol MyViewDelegate : AnyObject {
    func parentNeedsToTakeAction(sender: MyView)
}

class MyView : UIView {
  ...
  weak var delegate : MyViewDelegate?
  ....
  func initiateCallBack(){
      delegate?.parentNeedsToTakeAction(self)
  }
}

并且视图控制器符合该视图的委托

在我将 self 传回 VC 之前,我知道 VC 持有对视图的强引用,而视图只持有对 VC 的弱引用(通过委托)

但是之后会发生什么?视图的 ARC 现在是 2 还是仍然是 1,VC 持有 1 或 2 个对该视图的强引用?

如果在 VC 中我继续采取行动,然后从它的视图中删除发送者(子视图),子视图是否会从内存中释放?

标签: iosswift

解决方案


只有当引用的接收者在一段时间内保留该引用时,才会导致内存泄漏。当您调用 时delegate?.parentNeedsToTakeAction(self),该方法会parentNeedsToTakeAction运行非常短的时间然后结束。随着时间的推移,不会保留任何引用self,因此没有泄漏的危险。


推荐阅读