Быстрая утечка памяти
Мы пытаемся использовать структуры Swift там, где можем. Мы также используем RxSwift, который имеет методы, которые принимают замыкания. Когда у нас есть структура, которая создает замыкание, которое относится ксам, что создаетсильный референсный цикл.
import Foundation
import RxSwift
struct DoesItLeak {
var someState: String = "initial value"
var someVariable: Variable<String> = Variable("some stuff")
let bag = DisposeBag()
mutating func someFoo() {
someVariable.subscribeNext { person in
self.someState = "something"
}
.addDisposableTo(bag)
}
}
Откуда я это знаю? Если я создаю 100 000 объектов DoesItLeak и вызываю someFoo () для каждого из них, я считаю, что у меня есть 100 000 объектов с сильными ссылочными циклами. Другими словами, когда я избавляюсь от массива DoesItLeak, содержащего эти объекты, объекты остаются в памяти. Если я не вызываю someFoo (), проблем нет.
Переменная является классом. Итак, я могу видеть эту проблему с памятью, используя Распределение инструментов xcode и фильтрацию вПеременная <String>
Если я пытаюсь использовать [слабое Я], например, в следующем, я получаю ошибку компилятора:
someVariable.subscribeNext { [weak self] person in
Ошибка компилятора: «Слабый не может быть применен к не классу»
В реальном / не-примерном коде мы обращаемся к методам и переменным через себя, и это проблема памяти.
Как я могу решить эту проблему с памятью, сохраняя IsItLeak в виде структуры?
Спасибо за вашу помощь.