你能通过使用函数来避免闭包内存泄漏吗?

问题描述 投票:0回答:1

所以我正在使用

RxSwift
并且有一个
function
看起来像这样:

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

我注意到我忘记在

[weak self]
中使用
.flatMap
所以我这样添加它:

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

我无法绕过它,所以我尝试使用嵌套的

function
而不是
closure
,结果是这样的:

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)
}

太好了,编译器很高兴并且可以正常工作。在我的世界中,这解决了内存泄漏问题,因为我不再使用需要引用

closure
self
但是,我的一位同事告诉我,这与在
[weak self]
中不使用
closure
完全一样;并且您仍然使用嵌套的
memory leaks
受到
function
的影响。我真的看不出它们是同一回事,因为甚至没有提到
self
了。

无论如何,我的问题是:我是否使用上面的嵌套函数解决了

memory leaks
self
[weak self]
的问题,或者我的同事是否正确:这是同一回事;我的所作所为没有收获吗?

ios swift memory-leaks closures rx-swift
1个回答
0
投票

但是,我的一位同事告诉我,这与在闭包中不使用 [weak self] 完全一样;并且您仍然使用嵌套函数遭受内存泄漏。

你的同事错了。它与使用 weak self 不同,并且您不会因为没有使用 self 而遭受内存泄漏。

但是,还有更简单的方法:

最明显的:

.flatMap { [parameterService] _ in parameterService.requestTestMode() }
这基本上就是你在闭包中所做的。

另一种选择:

.flatMap { [weak self] _ in self?.parameterService.requestTestMode() ?? .just(0) }
发出的值是有问题的,因为您使用了 Single,您必须发出一些东西。如果你使用了 Maybe 或 Observable,你可以只使用
.empty()

© www.soinside.com 2019 - 2024. All rights reserved.