SwiftUI – ObservedObject никогда не освобождаетсяIOS

Программируем под IOS
Anonymous
SwiftUI – ObservedObject никогда не освобождается

Сообщение Anonymous »

Мое приложение пропускает объекты модели, поскольку в них сохраняются замыкания, сохраняющие само представление.
Лучше показать на примере.
В приведенном ниже коде Model не освобождается после исчезновения ContentView.

Код: Выделить всё

//
// Content View is an owner of `Model`
// It passes it to `ViewB`
//
// When button is tapped, ContentView executes action
// assigned to Model by the ViewB
//
struct ContentView: View {

@StateObject private var model = Model()

var body: some View {
VStack {
Button(action: {
model.action?()
}) {
Text("Tap")
}
ViewB(model: model)
}
.frame(width: 100, height: 100)
.onDisappear {
print("CONTENT DISAPPEAR")
}
}
}

struct ViewB: View {

@ObservedObject var model: Model

var body: some View {
Color.red.frame(width: 20, height: 20)
.onAppear {
//
// DANGER:
// Assigning this makes a leak and Model is never deallocated.
// This is because the closure is retaining 'self'
// But since it's a struct, how can we break the cycle here?
//
model.action = { bAction() }
}
}

private func bAction() {
print("Hey!")
}

}

class Model: ObservableObject {

var action: (() -> Void)?

deinit {
print("MODEL DEINIT")
}
}

Я не понимаю, почему здесь происходит какой-то цикл сохранения.
Поскольку View — это структура, ссылка на нее в замыкании должна быть безопасной, верно?

Подробнее здесь: https://stackoverflow.com/questions/685 ... eallocated

Вернуться в «IOS»