gpt4 book ai didi

Swift Combine .debounce 内存泄漏?

转载 作者:行者123 更新时间:2023-12-04 04:19:37 27 4
gpt4 key购买 nike

我想我发现了与 Swift Combine 的去抖操作符相关的内存泄漏。这要么是泄漏,要么我做错了什么。这是一个重现问题的简单示例:


@IBOutlet weak var currentValueLabel: UILabel!

var numberSubject = CurrentValueSubject<Int, Never>(0)
var bag = [AnyCancellable]()

override func viewDidLoad() {
super.viewDidLoad()

setupSubscription()
bag.removeAll()
}

func setupSubscription() {
numberSubject
.debounce(for: .seconds(0.5), scheduler: DispatchQueue.main)
.sink { [weak self] in self?.currentValueLabel.text = "\($0)" }
.store(in: &bag)
}
}

debounce 运算符的简单用法似乎导致了 malloc 泄漏(使用 Memory Debugger 检查):

Leak with debounce

更新 setupSubscription() 以放弃 debounce 似乎可以修复它:

    func setupSubscription() {
numberPublisher
// .debounce(for: .seconds(0.5), scheduler: DispatchQueue.main)
.receive(on: DispatchQueue.main)
.sink { [weak self] in self?.currentValueLabel.text = "\($0)" }
.store(in: &bag)
}

如果您使用此修改运行,并等待 View 加载(也就是订阅发生,然后将其从数组中删除),您会注意到泄漏不再存在。泄漏神奇地消失了。

如果我做错了什么,有人可以告诉我吗?这对我来说像是一个错误。

谢谢!

最佳答案

在使用内存图跟踪的模拟器中, Debug模式下的内存管理不是很真实。我在一台设备上用 Instruments 试过这个,我看到一个 16 字节的 malloc 泄漏。在我看来,人们不应该为小事操心,这是非常小的事。如果愿意,您可以向 Apple 报告,但别担心,开心就好。

关于Swift Combine .debounce 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59708086/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com