Я думаю, что обнаружил утечку памяти, связанную с оператором debounce 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
(проверено с помощью отладчика памяти):
Обновление 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)
}
Если вы запустите эту модификацию и дождитесь представления чтобы загрузить, (иначе для подписки произойдет, а затем для ее удаления из массива), вы заметите, что утечки больше нет. Утечка волшебным образом исчезла.
Может кто-нибудь сказать мне, если я делаю что-то ужасно неправильно? Для меня это похоже на ошибку.
Спасибо!