如何弱引用作为参数传递的函数

时间:2018-05-29 10:42:34

标签: ios swift

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

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

这很有效。但是,最初我的代码看起来像这样:

eventModel.listenToQueue(updateHandler: queuerDidChange)

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

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

是否有可能做我想做的事,或者我只是坚持我已经得到的代码?谢谢!

2 个答案:

答案 0 :(得分: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)
}

答案 1 :(得分:0)

我在其中一个应用中注意到了这一点。我喜欢传递方法本身的外观,但我也必须使用你提到的弱引用技术。

我认为这是有道理的,因为方法实现是在类本身上进行的,并且self在实例化类时绑定到该实现。因此,方法始终强烈引用self

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