swift - ReactiveCocoa 内存泄漏 - UIButton 的 CocoaAction 防止 MVVM 对象反初始化
问题描述
我正在使用 MVVM + ReactiveCocoa。
我的代码按预期工作。当我从父
级删除时,除了ViewModel
对象一直留在“调试内存图”中。deinited,不像.ViewController
ViewController
ViewModel
以下是按钮操作的外观ViewModel
:
var changeStatus: Action<Book.Status, Void, NoError> {
return Action<Book.Status, Void, NoError> { status -> SignalProducer<Void, NoError> in
return SignalProducer<Void, NoError> { [weak self] observer, error in
if let strongSelf = self {
strongSelf.status.value = status
observer.sendCompleted()
}
}
}
}
为按钮分配动作ViewController
:
reading.reactive.pressed = CocoaAction(viewModel.changeStatus, input: .reading)
reading
按钮也保留在内存中。
当我评论为按钮分配动作时,ViewModel
成功取消。因此,我得出结论,这就是问题所在。这条线是否有可能保持强参考?
尊敬的社区,有没有办法使用 ReactiveCocoa 添加按钮操作,以便ViewModel
及时删除对象?
解决方案
尝试这个。通过延迟定义您的操作,您可以确保它的关闭不会被保留。
lazy var changeStatus: Action<Book.Status, Void, NoError> = {
return Action<Book.Status, Void, NoError> { status -> SignalProducer<Void, NoError> in
return SignalProducer<Void, NoError> { [weak self] observer, error in
if let strongSelf = self {
strongSelf.status.value = status
observer.sendCompleted()
}
}
}
}()
推荐阅读
- java - 如何解决“weblogic.application.ModuleException:java.lang.ClassNotFoundException:org.glassfish.jersey.servlet.ServletContainer”错误
- php - 在 CodeIgniter 中使用重音字符
- python-3.x - pygame.colliderect() 在这两种情况下的工作方式是否相同?
- c# - '执行命令定义时发生错误。有关详细信息,请参阅内部异常。
- ios - 系统图像在 iOS 13 上显示,但在 iOS 12 及之前的版本上不显示
- omnet++ - 如何在 OMNet++ 控制台上实时打印碰撞?
- django - 用户登录后,Django登录按钮变为注销
- kubernetes - RocketChat 安卓应用 SSL 连接问题
- python - 如何校准我的分类神经网络的输入形状?
- javascript - 在标签上单击事件时将类添加到表单中的标签