【问题标题】:Memory leak in TabView with PageTabViewStyle带有 PageTabViewStyle 的 TabView 中的内存泄漏
【发布时间】:2020-11-01 12:58:15
【问题描述】:

我正在使用UIPageViewController 行为的标签视图。所以我定义了以下模型:

class WalktroughModel: Identifiable, ObservableObject {
  let id: UUID = UUID()
  let imageName: String
  let title: String

  init(imageName: String, title: String) {
      self.imageName = imageName
      self.title = title
  }
}

现在我使用这个 swiftUI 视图作为标签视图的子视图:

struct WalktroughAsset: View {

  @StateObject var asset: WalktroughModel

  var body: some View {
      Image(asset.imageName)
          .resizable()
          .overlay(Color.black.opacity(0.43))
          .overlay(
              VStack{
                  Spacer()
                  Text(asset.title)
                      .foregroundColor(.white)
                      .font(.custom("OpenSans-regular", size: 22.0))
              }
              .padding(.bottom, 64)
          )
    }
}

在我的内容视图中,我有以下内容:

struct ContentView: View {

   var thumbs: [WalktroughModel] = [WalktroughModel(imageName: "splash-1", title: "Concepto 1"), WalktroughModel(imageName: "splash-2", title: "Concepto 2"), WalktroughModel(imageName: "splash-3", title: "Concepto 3")]

   var body: some View {
       ZStack {
           Color.black.overlay(TabView{
               ForEach(thumbs) {
                   image in
                   WalktroughAsset(asset: image)
               }
           }
           .tabViewStyle(PageTabViewStyle())
           .padding([.bottom, .top], 32)
           )
        
       }
       .edgesIgnoringSafeArea(/*@START_MENU_TOKEN@*/.all/*@END_MENU_TOKEN@*/)
    
   }
}

现在,当我构建和运行时,当我滑动到另一个视图时,内存会从 80 mb 跳到 160 mb,当我滑动到第三个视图时,内存会跳到 230 mb。会发生什么?

最好的问候

【问题讨论】:

  • 很可能它会多次加载所有视图。可以尝试这样的事情stackoverflow.com/a/61234030/4080925 即使它不是一个可以解决你问题的导航。
  • @MwcsMac 但如何在 tabview 中避免这种情况?
  • 可能你的图片很大。
  • @Asperi 没错,但我想释放那段记忆。我怎样才能得到它?
  • 仪器/泄漏是否显示内存泄漏?如果是 - 你会显示泄漏的堆栈/对象吗?如果不是——那么就没有泄漏——我们使用 ARC,因此运行时自行决定何时从内存中删除已释放的资源。

标签: ios swift memory-management memory-leaks swiftui


【解决方案1】:

这段代码为我修复了内存泄漏

struct TabViewWrapper<Content: View, Selection: Hashable>: View {
    @Binding var selection: Selection
    @ViewBuilder let content: () -> Content
    
    var body: some View {
        TabView(selection: $selection, content: content)
    }
}

TabView(selection:) 替换为TabViewWrapper(selection:)

TabViewWrapper(selection: $selection) {
    tabContent
}
.tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))

当您使用带有 args 的自定义视图时会出现此错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-17
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 2012-04-06
    • 1970-01-01
    相关资源
    最近更新 更多