当在用作@ObservedObject目标的SubView中使用NavigationLink成员时,该类永远不会被释放。
示例:
import Combine
import SwiftUI
struct ParentView: View {
var body: some View {
NavigationView {
List {
ForEach(0..<10) { i in
ZStack {
Text("row \(i)")
NavigationLink(destination: SubView()) {
EmptyView()
}
}
}
}
}
}
}
struct SubView: View {
@ObservedObject private var viewModel = ViewModel()
var body: some View {
Text("bar")
}
}
final class ViewModel: ObservableObject {
init() {
print("init - \(String(describing: type(of: self)))")
}
deinit {
print("deinit - \(String(describing: type(of: self)))")
}
}在这种情况下,导航堆栈来回运行会产生同样多的ViewModel实例。
记忆图:

发布于 2021-06-08 22:26:05
在iOS 14中,可以通过用@StateObject注释viewModel来解决这个问题。
在使用@ObservedObject时,您会注意到ViewModel在构造ParentView时是初始化的。使用@StateObject时,只有在导航到SubView之后才初始化ViewModel。
在iOS 13中,您很可能必须在SubView中绑定,或者使用在所有SubViews之间共享的@EnvironmentObject来中断自@StateObject在iOS 14中引入以来的保留周期。
原因何在?
我假设Apple引入@StateObject是为了解决这个问题,并向编译器表明,当从内存中删除拥有的结构时,应该解除类成员的分配。
https://stackoverflow.com/questions/67895297
复制相似问题