我写了一个关于这个泄漏的演示。
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),并处理回收问题,仍然报告泄漏。
我真的很困惑。我希望有人能告诉我为什么会发生这种情况,我该如何解决它,或者将来避免这种泄漏。
谢谢。