swift - ReactiveCocoa 内存泄漏 - UIButton 的 CocoaAction 阻止 MVVM 对象反初始化

标签 swift mvvm uibutton reactive-cocoa

我正在使用 MVVM + ReactiveCocoa。

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

阅读按钮也保留在内存中。

当我评论为按钮 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()
            }
        }
    }
}()

关于swift - ReactiveCocoa 内存泄漏 - UIButton 的 CocoaAction 阻止 MVVM 对象反初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53638920/

相关文章:

ios - didUpdateLocations 在 Swift 3 中不起作用

silverlight - 如何在Silverlight 4中用NavigationService实现MVVM?

c# - MVVM ViewModel 创建和绑定(bind)

swift - 在 iOS 中加载 TableView 数据时出现 TableView 部分问题

ios - 将图像从库加载到 UICollection View 。应用程序不断崩溃

ios - 某些字体不适用于 XCode 中的 UIButton

ios - 以编程方式添加带有按钮的 View

ios - 如何在设计器中的自定义按钮控件上显示图像

iOS--Swift 3--SwiftAlertView--可选类型

C# EditableValue<T> 实现