【问题标题】:RxSwift [weak self] is accessible to all other operators belowRxSwift [weak self] 可供以下所有其他运算符访问
【发布时间】:2021-12-23 03:15:37
【问题描述】:

我正在使用 Rxswift 来设计 ViewModel。 下面是我写的代码。 在我的第一个 map 运算符中,使用了 [weak self] 并使用了 guard 来展开值。

我意识到我在第一张地图中展开的“自我”在第二张地图和下面的所有其他运算符中仍然可用。

但我不太清楚为什么第一个 map 运算符中的 unwrapped self 在下面的运算符中仍然可用,以及在其他运算符中使用时是否会出现问题

let textObservable = input.subject
      .map { [weak self] _ -> [String] in
          guard let self = self else { return [] }
          return [$0]
       }.map { maps in
          maps.map { text -> String in
              return self.makeString(string: text)
          }
       }

【问题讨论】:

  • 由于您在maps.map { ... } 闭包中明确引用selfself.makeString(string: text),因此它正在捕获强自引用。它不关心之前地图关闭中的[weak self]。 Rx 在这里无关紧要。
  • 这里有什么问题?

标签: swift mvvm rx-swift


【解决方案1】:

但我不太清楚为什么第一个 map 运算符中的 unwrapped self 在下面的运算符中仍然可用,以及在其他运算符中使用时是否会出现问题

解包后的 self 在下面的运算符中不可用。你在第二次闭包中重新保留了自我。

是的,可能会有问题。如果您将可取消对象存储在由self 表示的对象中(这是正常做法),那么您已经设置了一个保留周期,并且 self 的内存将永远不会被释放...

【讨论】:

    猜你喜欢
    • 2016-05-02
    • 2015-12-25
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多