0

我写了一个关于这个泄漏的演示。

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)
        
        // not leak
        viewModel.name.asObservable().bind(to: nameLabel.rx.text).disposed(by: disposeBag)
        
        // leak
//        viewModel.name.asDriver().drive(onNext: { [weak self] (name) in
//            guard let weakSelf = self else { return }
//            weakSelf.nameLabel.text = name
//        }).disposed(by: disposeBag)
        
        // leak
//        viewModel.name.asDriver().drive(nameLabel.rx.text).disposed(by: disposeBag)
        
        viewModel.name.accept("act")
    }
}

class ViewModel {
    let name: BehaviorRelay<String> = BehaviorRelay(value: "")
}

在 Xcode Instrument Leaks 中,它会在使用驱动程序时报告泄漏。但是改为“bindTo”,它工作正常,没有泄漏报告。

我将“driver.driveTo”更改为driver.drive(onNext),并处理回收问题,仍然报告泄漏。

我真的很困惑。我希望有人能告诉我为什么会发生这种情况,我该如何解决它,或者将来避免这种泄漏。

谢谢。

4

0 回答 0