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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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