gpt4 book ai didi

memory-leaks - SwiftUI NavigationLink内存泄漏

转载 作者:行者123 更新时间:2023-12-03 09:27:42 25 4
gpt4 key购买 nike

我对SwiftUI的NavigationView堆栈中的内存管理工作方式有疑问。我有一个 View ,其中声明了NavigationView和NavigationLink,在NavigationLink的目标参数内是我的TestView。导航效果很好,但是当我从堆栈中弹出 View (例如,向上后退按钮)时,不会在控制台中打印deinit,并且仍可以在内存图中找到TestViewModel。当不再需要TestViewModel时,我该如何对其进行初始化?

    /// First view in application
struct ContentView: View {

var body: some View {
NavigationView {
VStack {
Text("Hello, leak!")
NavigationLink(
destination: TestView(viewModel: TestViewModel()),
label: { Text("Create leak 🤷‍♂️") }
)
}
}
}
}

/// Just simple class for init and deinit print
class TestViewModel: ObservableObject {

@Published var text = "Test"

init() {
print("TestViewModel init")
}

deinit {
print("TestViewModel deinit")
}
}

/// Second view, which is poped from stack
private struct TestView: View {

@ObservedObject var viewModel: TestViewModel

var body: some View {
Text(viewModel.text)
}
}

更新
添加了内存图屏幕截图,我以前忘了。

Memory graph screenshot bottom part

Memory graph screenshot top part

更新

在可导航的真实设备上进行了测试。看起来,当弹出 View 时, View 模型并未取消初始化,但在下一次按下时, View 模型并未再次初始化。但是问题仍然存在,当在导航堆栈中弹出 View 时,是否有一种方法可以初始化 View 模型?
TestViewModel init
TestViewModel deinit
TestViewModel init

另外,当我将另一个 View 添加到堆栈时,行为也会有所变化。现在,第二个 View 的 View 模型将导致泄漏,但第一个将按预期被取消初始化。
First view push
TestViewModel init
Second view push
TestViewModel2 init
Second view pop
First view pop
TestViewModel deinit

最佳答案

我遇到了同样的问题,花了很多时间来解决。最后我明白了!使用.navigationViewStyle(StackNavigationViewStyle())。添加是NavigationView的功能:

NavigationView {
...
}
.navigationViewStyle(StackNavigationViewStyle())

关于memory-leaks - SwiftUI NavigationLink内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60129552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com