我的视图控制器中有一个强引用模型,该模型具有listenToQueue“侦听”我的 Firebase 数据库以进行实时更新的功能。每当发生更新时,它都会将一个对象传回我的视图控制器,然后它会调用一个函数。这是我的代码:
eventModel.listenToQueue { [weak self] queuer in
self?.queuerDidChange(queuer: queuer)
}
Run Code Online (Sandbox Code Playgroud)
这有效。但是,最初我的代码是这样的:
eventModel.listenToQueue(updateHandler: queuerDidChange)
Run Code Online (Sandbox Code Playgroud)
这导致模型和视图控制器之间的保留循环。但是,该代码看起来更清晰,所以我想知道是否有办法queuerDidChange通过对 self 的弱引用来传递函数?我已经试过了,但保留周期仍然存在:
weak var weakSelf = self
eventModel.listenToQueue(updateHandler: weakSelf?.queuerDidChange)
Run Code Online (Sandbox Code Playgroud)
是否可以做我想做的事,还是我应该坚持我拥有的代码?
weak var weakSelf = self
eventModel.listenToQueue(updateHandler: weakSelf?.queuerDidChange)
Run Code Online (Sandbox Code Playgroud)
以上代码与以下代码相同:
eventModel.listenToQueue(updateHandler: queuerDidChange)
Run Code Online (Sandbox Code Playgroud)
因为您weakSelf立即声明并使用它。weakSelf?.queuerDidChange与 没有关系weakSelf,而是已经包含对self自身的引用。我假设queuerDidChange成员函数。因此,避免保留循环的唯一方法就是您所说的脏方法。
eventModel.listenToQueue { [weak self] queuer in
self?.queuerDidChange(queuer: queuer)
}
Run Code Online (Sandbox Code Playgroud)
我在我的一个应用程序中注意到了这一点。我喜欢传递方法本身的外观,但我也必须使用您提到的弱引用技术。
\n\n我认为这是有道理的,因为方法实现保存在类本身上,并且self在实例化类时绑定到该实现。因此,一个方法总是有一个强引用self。
而在 Swift 中,函数参数是强引用的。我不认为\xe2\x80\x99有一种使用弱引用传递任何参数的方法。
\n| 归档时间: |
|
| 查看次数: |
2458 次 |
| 最近记录: |