memory-leaks - 使用 RxSwift Driver 导致内存泄漏
问题描述
我写了一个关于这个泄漏的演示。
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),并处理回收问题,仍然报告泄漏。
我真的很困惑。我希望有人能告诉我为什么会发生这种情况,我该如何解决它,或者将来避免这种泄漏。
谢谢。
解决方案
推荐阅读
- ios - iOS UIScrollView 在弹出/推送时向下滚动(UIKeyboardWillChangeFrameNotification 交互触发)
- visual-studio-code - VSCode 自定义宏
- go - 如何将上下文值从 Gin 中间件传播到 gqlgen 解析器?
- css - Tailwind css - 使用 className 自定义间距值作为 tailwind 配置的变量
- python - for循环和同义词匹配的性能改进
- scala - 如何仅更改 Seq 的一个元素?
- zap - 将后端端口添加到 ZAP 范围
- spring-boot - 当表有大量记录时休眠无法更改表
- leaflet - 设置工具提示不透明度
- amazon-web-services - AWS SAM 指定 zip 文件名并使用版本控制