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:disposed(by: disposeBag) 真的有效吗?
为啥在 BinaryReader 上调用 Dispose() 会导致编译错误?
为啥即使服务仍然引用它,也会在 DataContract 上调用 Dispose?