我的视图控制器中有一个强引用的模型,它有一个函数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)
是否有可能做我想做的事,或者我只是坚持我已经得到的代码?谢谢!
答案 0 :(得分:1)
weak var weakSelf = self
eventModel.listenToQueue(updateHandler: weakSelf?.queuerDidChange)
以上代码与以下代码相同:
eventModel.listenToQueue(updateHandler: queuerDidChange)
因为您声明weakSelf
并立即使用它。 weakSelf?.queuerDidChange
与weakSelf
无关,而是已包含对self
本身的引用。我假设queuerDidChange
成员函数。因此,避免保留周期的唯一方法就是你所谓的肮脏方式。
eventModel.listenToQueue { [weak self] queuer in
self?.queuerDidChange(queuer: queuer)
}
答案 1 :(得分:0)
我在其中一个应用中注意到了这一点。我喜欢传递方法本身的外观,但我也必须使用你提到的弱引用技术。
我认为这是有道理的,因为方法实现是在类本身上进行的,并且self
在实例化类时绑定到该实现。因此,方法始终强烈引用self
。
在Swift中,强烈引用了函数参数。我认为没有办法使用弱引用传递任何参数。