【问题标题】:ReactiveCocoa memory leak - CocoaAction of UIButton prevents MVVM object deinitializationReactiveCocoa 内存泄漏 - UIButton 的 CocoaAction 防止 MVVM 对象反初始化
【发布时间】:2018-12-05 18:51:45
【问题描述】:

我正在使用 MVVM + ReactiveCocoa。

我的代码按预期工作。当我从父级删除ViewController 时,除了ViewModel 对象一直停留在“调试内存图”中。 ViewController deinited,不像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 对象?

【问题讨论】:

  • 该行保持对viewModel.changeStatus 的强引用(而不是viewModel 本身),并且应该在reading 按钮被取消初始化时释放该引用。你提到ViewController deinited: 是reading 肯定也被deinited 了吗?
  • @jjoelson,好点,reading 按钮保留在内存中。我会将此添加到我的问题中。

标签: swift mvvm uibutton reactive-cocoa


【解决方案1】:

试试这个。通过lazy定义你的动作,你可以确保它的关闭不会被保留。

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()
            }
        }
    }
}()

【讨论】:

  • 非常感谢您的回答。我发现了我的问题,而 ReactiveCocoa 与内存泄漏无关。我将我的ViewController 添加到另一个视图中,并使用他的视图层进行了操作。我使用view.layer.insertSublayer(viewController.view.layer, above: nextItem.viewController.view.layer) 来更改图层的顺序,但是当我在view.bringSubviewToFront(viewController.view) 上替换它时,问题就解决了。
猜你喜欢
  • 1970-01-01
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 2013-11-01
  • 2015-02-05
相关资源
最近更新 更多