【问题标题】:How to weak reference a function passed as a parameter如何弱引用作为参数传递的函数
【发布时间】:2018-05-29 10:42:34
【问题描述】:

我的视图控制器中有一个强引用模型,它有一个函数listenToQueue,它“监听”我的 Firebase 数据库以进行实时更新。每当发生更新时,它都会将一个对象传回给我的视图控制器,然后它会调用一个函数。这是我的代码:

eventModel.listenToQueue { [weak self] queuer in
    self?.queuerDidChange(queuer: queuer)
}

这行得通。然而,最初我的代码是这样的:

eventModel.listenToQueue(updateHandler: queuerDidChange)

这导致了模型和视图控制器之间的保留循环。但是,该代码看起来更干净,所以我想知道是否有办法通过对 self 的弱引用来传递 queuerDidChange 函数?我已经尝试过了,但保留周期仍然存在:

weak var weakSelf = self
eventModel.listenToQueue(updateHandler: weakSelf?.queuerDidChange)

是否有可能做我想做的事,还是我应该坚持我拥有的代码?

【问题讨论】:

    标签: ios swift


    【解决方案1】:
    weak var weakSelf = self
    eventModel.listenToQueue(updateHandler: weakSelf?.queuerDidChange)
    

    以上代码与以下代码相同:

    eventModel.listenToQueue(updateHandler: queuerDidChange)
    

    因为您声明了weakSelf 并立即使用它。 weakSelf?.queuerDidChangeweakSelf 没有关系,而是已经包含对 self 本身的引用。我假设queuerDidChange 成员函数。所以避免保留循环的唯一方法就是你所说的脏方法。

    eventModel.listenToQueue { [weak self] queuer in
        self?.queuerDidChange(queuer: queuer)
    }
    

    【讨论】:

    • 有没有办法在函数签名内的闭包定义中强制执行 [weak self]?例如。 :listenToQueue(_closure:(weak EventModel)->Void)
    • @A.L.Srine 没有,我相信不会
    【解决方案2】:

    我在我的一个应用中注意到了这一点。我喜欢传入方法本身的样子,但我也不得不使用你提到的弱引用技术。

    我认为这是有道理的,因为方法实现保存在类本身上,当类被实例化时,self 绑定到该实现。因此,方法将始终具有对self 的强引用。

    在 Swift 中,函数参数是强引用的。我认为没有办法使用弱引用传递任何参数。

    【讨论】:

      猜你喜欢
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-09
      • 2020-11-29
      • 2014-06-29
      • 1970-01-01
      • 2011-01-31
      • 2021-01-14
      相关资源
      最近更新 更多