提问人:Joakim Sjöstedt 提问时间:2/24/2023 最后编辑:Joakim Sjöstedt 更新时间:2/24/2023 访问量:118
能否改用函数来避免闭包内存泄漏?
Can you avoid closure memory leaks by using functions instead?
问:
所以我正在使用并有一个看起来像这样的: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]
答:
但是,我的一位同事告诉我,这与在闭合中不使用[弱我]是一回事;并且您仍然会使用嵌套函数进行内存泄漏。
你的同事是对的。(这让我很惊讶。
幸运的是,有更简单的方法:
最明显的是:通过直接捕获 parameterService 而不是通过 self 间接捕获,可以避免捕获 self。.flatMap { [parameterService] _ in parameterService.requestTestMode() }
另一种选择:要发出的值是有问题的,因为你使用了 Single,所以你必须发出一些东西。如果您使用了 Might 或 Observable,则可以只使用.flatMap { [weak self] _ in self?.parameterService.requestTestMode() ?? .just(0) }
.empty()
喜欢这个:.asMaybe().flatMap { [weak self] _ in self?.parameterService.requestTestMode().asMaybe() ?? .empty() }
最后,您可以使用一个自由函数(一个不绑定到任何类或结构的函数):
func requestTestMode(parameterService: ParameterService) -> (Int?) -> Single<Int?> {
{ _ in parameterService.requestTestMode() }
}
可以这样使用: 这实际上与我上面给出的第一个选项相同。.flatMap(requestTestMode(parameterService: parameterService))
评论
weak self] (_: Int?) in self.parameterService.requestTestMode()
self.parameterService
self?.parameterService
weak self
self
self
self?
self
self
parameterService.requestTestMode()
weak self
deinit
weak self
(_: Int?)