简体   繁体   English

带有 PageTabViewStyle 的 TabView 中的 Memory 泄漏

[英]Memory leak in TabView with PageTabViewStyle

I'm using a tab view using the UIPageViewController behaviour.我正在使用UIPageViewController行为的选项卡视图。 So I defined the following model:所以我定义了以下model:

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
  }
}

Now I use this swiftUI view as a child view of tab view:现在我使用这个 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)
          )
    }
}

In my content view I have the following:在我的内容视图中,我有以下内容:

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@*/)
    
   }
}

Now, when I build and run the memory jumps 80 mb to 160 mb when I swipe to the other view and jumps to 230 mb when I swipe to the third view.现在,当我构建并运行 memory 时,当我滑动到另一个视图时,memory 会从 80 mb 跳到 160 mb,当我滑动到第三个视图时,它会跳到 230 mb。 What could be happen?可能会发生什么?

Best Regards此致

This code fixes a memory leak for me此代码为我修复了 memory 泄漏

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

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

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

This bug is presented when you use custom view with args当您使用带有 args 的自定义视图时会出现此错误

Similar issue on iOS 15 (Tested on 15.2) iOS 15 上的类似问题(在 15.2 上测试)

Memory use for the below SwiftUI app will continuously increase over time. Memory 用于以下 SwiftUI 应用程序将随着时间的推移不断增加。 The app is simply showing a TabView in a full screen cover, and has a timer that refreshes a countdown every second.该应用程序只是在全屏封面中显示一个 TabView,并有一个每秒刷新倒计时的计时器。 If I display a simple text element instead of the TabView, the memory use will behave properly.如果我显示一个简单的文本元素而不是 TabView,则 memory 的使用将正常运行。 I submitted a feedback to Apple.我向 Apple 提交了反馈。

import SwiftUI

class ContentView_manager : ObservableObject {
    var view_timer: Timer?
    @Published var countdown_txt: String?
    
    func startTimer(){
        if self.view_timer == nil  {
                       self.view_timer = Timer(fireAt: Date(), interval: 1, target: self, selector: #selector(self.timer_action), userInfo: nil, repeats: true)
                       RunLoop.current.add(self.view_timer!, forMode: RunLoop.Mode.common)
        }
    }
    
    func stopTimer(){
        if self.view_timer != nil  {
            self.view_timer?.invalidate()
            self.view_timer = nil
        }
    }
    
    @objc
    func timer_action(){
        //update number of seconds until January 2023
        print("Timer Action")
        self.countdown_txt = String(DateInterval(start: Date(), end: Date(timeIntervalSince1970: 1672527600)).duration)
    }
}

@main
struct debugApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView(view_manager:ContentView_manager())
        }
    }
}

struct ContentView : View {
    @ObservedObject var view_manager : ContentView_manager
    @State var show_cover : Bool = false
    var body: some View {
       
        VStack{
            Button(action: {
                self.show_cover = true
            }, label: {Text("Show screen cover with TabView")})
        }
        .fullScreenCover(isPresented: self.$show_cover){ScreenCover(view_manager: view_manager)}
    }
}

struct ScreenCover: View {
    @ObservedObject var view_manager : ContentView_manager
    var body: some View {
        tab(txt:view_manager.countdown_txt)
        .onAppear(perform: {
            view_manager.startTimer()
        })
        .onDisappear(perform: {
            view_manager.stopTimer()
        })
        
    }
}


struct tab: View {
    var txt: String?
    var body: some View {
        TabView{
            Text("First Tab")
                   .tabItem {
                       Image(systemName: "1.square.fill")
                       Text("First")
                   }
            Text("Next year in \(txt ?? "") seconds!")
                   .tabItem {
                       Image(systemName: "2.square.fill")
                       Text("Second")
                   }
               Text("Third tab")
                   .tabItem {
                       Image(systemName: "3.square.fill")
                       Text("Third")
                   }
        }
        .tabViewStyle(PageTabViewStyle())
        
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 带有 PageTabViewStyle 的 TabView 上的edgesIgnoringSafeArea 不起作用 - edgesIgnoringSafeArea on TabView with PageTabViewStyle not working 带有 PageTabViewStyle() 的 TabView 不使用 ScrollView 中的可用高度 - TabView with PageTabViewStyle() not using available height in ScrollView SwiftUI TabView PageTabViewStyle 防止更改标签? - SwiftUI TabView PageTabViewStyle prevent changing tab? SwiftUI TabView PageTabViewStyle 崩溃而不显示任何错误 - SwiftUI TabView PageTabViewStyle crashes without showing any error 如何在 SwiftUI 中使用 PageTabViewStyle 摆脱 TabView 上的索引点? - How can I get rid of index dots on TabView with PageTabViewStyle in SwiftUI? 带有 PageTabViewStyle 的 TabView 屏幕中的背景未填充整个可用垂直空间 - Background in screens in TabView w/ PageTabViewStyle doesn't fill entire vertical space available "SwiftUI TabView 与 PageTabViewStyle 在设备上的横向与 safeArea 添加奇数前沿插图" - SwiftUI TabView with PageTabViewStyle in Landscape on device with safeArea adding odd leading edge inset Icarousel内存泄漏泄漏 - Leak in Icarousel memory leak 会不会泄漏 memory - Will this leak memory 收到内存警告和内存泄漏 - Receive memory warning and memory leak
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM