问题描述
我正在尝试了解SwiftUI在内存管理方面的内部工作方式。我对此毫不怀疑。
当我将NavigationLink添加到具有某些搜索功能的第二视图并从云中加载一些数据时。
现在,当我回到根视图时,我的observableObject类仍在内存中。
有人知道SwiftUI如何管理内存和释放对象吗?
这是我实验的示例代码。
struct ContentView: View {
var body: some View {
NavigationView {
DemoView(screenName: "Home")
.navigationBarHidden(true)
}
}
}
struct DemoView:View {
var screenName:String
var body: some View {
vstack{
NavigationLink(destination: SecondView(viewmodel:Secondviewmodel())) {
Text("Take Me To Second View")
}
Text(self.screenName)
}
}
}
// Second View
class Secondviewmodel:ObservableObject {
@Published var search:String = ""
@Published var user:[String] = []
func fetchRecords() -> Void {
dispatchQueue.main.asyncAfter(deadline: dispatchTime.Now() + 3) { [weak self] in
self?.user = ["Hello","There"]
}
}
}
struct SecondView:View {
@Observedobject var viewmodel:Secondviewmodel
var body: some View {
vstack {
TextField("Search Here",text: $viewmodel.search)
.textFieldStyle(RoundedBorderTextFieldStyle())
.padding()
List(self.viewmodel.user,id:\.self) { user in
Text("User \(user)")
}
}.onAppear{
self.viewmodel.fetchRecords()
}
}
}
这就是我收到的内存图。
解决方法
好吧,我可能不记得有关同一问题的其他类似文章,但之所以如此,是因为您的SecondView
导致一个值,仍然在{{ 1}}后按,直到激活另一个NavigationLink。
因此,您需要为NavigationView
具有不同的独立生命周期,或者如果保持原样,则为其添加一些SecondViewModel
,因此只剩下纯空对象,即
reset/cleanup
,
SwiftUI中的对象生命周期照常。没有更多引用时,ARC将释放该对象。您可以添加deinit { print("deinit")}
到您的SecondViewModel
上,并查看对象何时被重新分配。是的,在您的情况下,每次评估SecondViewModel
主体时都会创建一个新的DemoView
对象,这可能不是您想要的。我建议您初始化SecondViewModel
对象并将其存储在视图层次结构之外,并在DemoView.body
中传递对此全局对象的引用。