You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用嵌套函数替代闭包能否避免RxSwift中的self内存泄漏?

关于RxSwift嵌套函数是否会引发内存泄漏的疑问

我在使用RxSwift时编写了如下函数:

private func setAndVerifyTestmode(isOn: Bool) {
    parameterService.setTestMode(value: isOn)
      .flatMap { _ in self.parameterService.requestTestMode() }
      .subscribe( { [weak self] _ in
        //do stuff })
      .disposed(by: disposeBag)
}

后来发现flatMap的闭包中忘记使用[weak self],于是修改代码如下:

private func setAndVerifyTestmode(isOn: Bool) {
    parameterService.setTestMode(value: isOn)
      .flatMap { [weak self] (_: Int?) in 
          guard let self = self else { return .just(nil) }
          self.parameterService.requestTestMode() }
      .subscribe( { [weak self] _ in
        //do stuff })
      .disposed(by: disposeBag)
}

但此时出现编译错误:Generic parameter Result could not be infered。无法解决该错误的情况下,我尝试用嵌套函数替代闭包,最终代码如下:

private func setAndVerifyTestMode(isOn: Bool) {
    func requestTestMode(_: Int?) -> Single<Int?> {
      parameterService.requestTestMode()
    }
     
parameterService.setTestMode(value: isOn)
      .flatMap(requestTestMode(_:))
      .subscribe( { [weak self] _ in
        //do stuff })
      .disposed(by: disposeBag)
}

这段代码能正常编译运行,我原本认为无需引用self就能解决内存泄漏问题,但同事表示这和闭包中不使用[weak self]的效果相同,仍会存在内存泄漏。我想知道:使用上述嵌套函数是否真的能避免内存泄漏、self引用相关问题,还是像同事所说的那样,这样做没有任何益处?


内容的提问来源于stack exchange,提问作者Joakim Sjöstedt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 00:57:27