RxSwift 为啥我们没有调用 dispose 会有内存泄漏

Posted

技术标签:

【中文标题】RxSwift 为啥我们没有调用 dispose 会有内存泄漏【英文标题】:RxSwift why do we have memory leak without calling disposeRxSwift 为什么我们没有调用 dispose 会有内存泄漏 【发布时间】:2018-01-14 23:21:39 【问题描述】:

我正在阅读有关 RxSwift 的内容,并且有很多关于内存泄漏的讨论。这里引用主要 RxSwift repo 的入门指南:

如果一个序列没有自行终止,例如一系列按钮点击,资源将被永久分配,除非手动调用 dispose,在 disposeBag 中自动调用,使用 takeUntil 运算符,或在其他一些方式。

这是Reactive Programming with Swift 第 2 章:Observables 的代码的 sn-p,其中内存确实泄漏:

Observable<String>.create( observer in
    observer.onNext("1")
    // observer.onError(MyError.anError)
    // observer.onCompleted()
    return Disposables.create()
).subscribe(
    onNext:  print($0) ,
    onError:  print($0) ,
    onCompleted:  print("Completed") ,
    onDisposed:  print("Disposed") 
)

我了解处置资源(例如,使用处置袋)非常重要。但是,我不明白的是:哪些资源正在泄漏以及如何泄漏?

【问题讨论】:

您为什么不想丢弃一次性用品? 嘿@iWheelBuy,我不想跳过它。我上面发布的示例来自它用作反例的书中,以解释为什么在 subscribe 调用之后添加 .dispose(by: disposeBag) 很重要(因为如果我们不调用 .onError 或 @ 可能会出现内存泄漏987654328@ 如上所述)。但是,对我来说,这里泄漏了哪个资源并不明显。 【参考方案1】:

它会泄漏,因为链和它捕获的所有资源都不会被释放。

RxSwift 分配一些对象,这些对象构成了您订阅的链。它们都占用内存并且对于您的Observable 链的正确业务逻辑是必需的。您还可以将一些超出范围的对象传递给链中的闭包,并且它们也将被保留,因为闭包是一种引用类型并强烈地保留它们捕获的资源。

【讨论】:

以上是关于RxSwift 为啥我们没有调用 dispose 会有内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift之深入解析dispose源码的实现

RxSwift:disposed(by: disposeBag) 真的有效吗?

为啥在 BinaryReader 上调用 Dispose() 会导致编译错误?

为啥即使服务仍然引用它,也会在 DataContract 上调用 Dispose?

为啥在 Graphics 对象上调用 dispose() 会导致 JPanel 不呈现任何组件

RxSwift:为啥 flatMapLatest 从不执行 onCompleted()?