Мы пытаемся использовать структуры Swift, где можем. Мы также используем RxSwift, у которого есть методы, которые принимают замыкания. Когда у нас есть структура, которая создает закрытие, которое ссылается на self, это создает сильный ссылочный цикл.
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 объектов DoItLeak и вызываю someFoo() для каждого из них, я считаю, что у меня есть 100 000 объектов с сильными ссылочными циклами. Другими словами, когда я избавляюсь от массива DoesItLeak, содержащего эти объекты, объекты остаются в памяти. Если я не вызываю someFoo(), проблем нет.
Переменная - это класс. Итак, я вижу эту проблему с памятью, используя привязки xcode Instruments и фильтрацию в переменной <String>
Если я попытаюсь использовать [слабый я], например, в следующем, я получаю ошибку компилятора:
someVariable.subscribeNext { [weak self] person in
Ошибка компилятора "слабый не может применяться к типу некласса"
В реальном/нестандартном коде мы получаем доступ к методам и переменным через self и это проблема памяти.
Как я могу решить эту проблему с памятью, сохраняя структуру IsItLeak?
Спасибо за вашу помощь.