使用RxSwift Driver出现内存泄漏?bindTo无泄漏的原因与修复方案
RxSwift 中Driver绑定被Instruments报告内存泄漏问题
问题复现代码
我编写了复现该内存泄漏问题的Demo,核心代码如下:
import UIKit import RxSwift import RxCocoa class ViewController: UIViewController { private let viewModel = ViewModel() private let disposeBag = DisposeBag() private lazy var nameLabel: UILabel = { let label = UILabel() label.text = "idle" return label }() override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = .white self.view.addSubview(nameLabel) nameLabel.frame = CGRect(x: 100, y: 100, width: 100, height: 30) // 无泄漏 viewModel.name.asObservable().bind(to: nameLabel.rx.text).disposed(by: disposeBag) // 泄漏 // viewModel.name.asDriver().drive(onNext: { [weak self] (name) in // guard let weakSelf = self else { return } // weakSelf.nameLabel.text = name // }).disposed(by: disposeBag) // 泄漏 // viewModel.name.asDriver().drive(nameLabel.rx.text).disposed(by: disposeBag) viewModel.name.accept("act") } } class ViewModel { let name: BehaviorRelay<String> = BehaviorRelay(value: "") }
观测到的异常现象
- 使用Xcode Instruments的Leaks工具检测时,使用Driver的场景会被报告存在内存泄漏;但将绑定方式替换为
bind(to:)后运行正常,无泄漏报告 - 将Driver的
drive方式替换为带[weak self]引用处理的drive(onNext:)写法,尝试规避循环引用问题,仍然会触发泄漏报告
待解答的问题
我对此十分困惑,希望能有人说明:
- 该问题的产生原因
- 对应的修复方案
- 后续如何规避这类内存泄漏问题
内容的提问来源于stack exchange,提问作者Jun Yun
相关产品推荐
相关产品推荐

