You need to enable JavaScript to run this app. 使用RxSwift Driver出现内存泄漏?bindTo无泄漏的原因与修复方案
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.12 13:45:04