【发布时间】:2022-10-05 06:00:48
【问题描述】:
我正在尝试实现一个协调器来管理流程。状态存储在 CoordinatorStore 中。有 2 个 @Published 属性用于管理流。这屏幕属性控制当前显示的视图和小路控制堆栈视图的导航堆栈。可以在下面找到实现的详细信息。
使用当前实施并在以下操作之后:秀A->展会->显示首字母
我希望 StoreS 和 Store 将从内存中释放,因为小路,它通过枚举关联值保存 StoreA 和 StoreB,被清空。
但这不会发生,如果我再次重复这些操作,内存中就会有 2 个 StoreA 和 2 个 StoreB 等等。我错过了什么吗?
在执行初始操作集后,我还将附上内存调试器快照的屏幕截图。
enum Path: Hashable {
case a(StoreA)
case b(StoreB)
}
enum Screen {
case initial
case stack
}
final class CoordinatorStore: ObservableObject {
@Published var path: [Path] = []
@Published var screen: Screen = .stack
func showA() {
let store = StoreA()
path.append(.a(store))
}
func showB() {
let store = StoreB()
path.append(.b(store))
}
func showInitial() {
path = []
screen = .initial
}
func showStack() {
screen = .stack
}
}
struct Coordinator: View {
@ObservedObject var store: CoordinatorStore
var body: some View {
switch store.screen {
case .initial: initial
case .stack: stack
}
}
var stack: some View {
NavigationStack(path: $store.path) {
VStack {
Text("Root")
}
.toolbar {
Button(action: self.store.showA) {
Text("Push A")
}
}
.navigationDestination(for: Path.self) { path in
switch path {
case .a(let store):
ViewA(store: store)
.toolbar {
Button(action: self.store.showB) {
Text("Push B")
}
}
case .b(let store):
ViewB(store: store)
.toolbar {
Button(action: self.store.showInitial) {
Text("Show Initial")
}
}
}
}
}
}
var initial: some View {
VStack {
Text("Initial")
Button(action: store.showStack) {
Text("Go to Stack")
}
}
}
}
struct ViewA: View {
@ObservedObject var store: StoreA
var body: some View {
Text("View A")
}
}
final class StoreA: NSObject, ObservableObject {
deinit {
print("Deinit: \(String(describing: self))")
}
}
struct ViewB: View {
@ObservedObject var store: StoreB
var body: some View {
Text("View B")
}
}
final class StoreB: NSObject, ObservableObject {
deinit {
print("Deinit: \(String(describing: self))")
}
}
【问题讨论】:
标签: ios swift swiftui memory-leaks swiftui-navigationstack