首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SubView中使用@观测点对象在NavigationLink中作为目标注释成员时保留循环

在SubView中使用@观测点对象在NavigationLink中作为目标注释成员时保留循环
EN

Stack Overflow用户
提问于 2021-06-08 22:26:05
回答 1查看 288关注 0票数 1

当在用作@ObservedObject目标的SubView中使用NavigationLink成员时,该类永远不会被释放。

示例:

代码语言:javascript
复制
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实例。

记忆图:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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是为了解决这个问题,并向编译器表明,当从内存中删除拥有的结构时,应该解除类成员的分配。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67895297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档