首页 > 解决方案 > ReactiveCocoa 内存泄漏 - UIButton 的 CocoaAction 防止 MVVM 对象反初始化

问题描述

我正在使用 MVVM + ReactiveCocoa。

我的代码按预期工作。当我从父 级删除时,除了ViewModel对象一直留在“调试内存图”中。deinited,不像.ViewControllerViewControllerViewModel

以下是按钮操作的外观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及时删除对象?

标签: swiftmvvmuibuttonreactive-cocoa

解决方案


尝试这个。通过延迟定义您的操作,您可以确保它的关闭不会被保留。

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

推荐阅读