ios 较大的SwiftUI结构导致内存错误

64jmpszr  于 2022-11-19  发布在  iOS
关注(0)|答案(2)|浏览(135)

我对iOS开发还很陌生。我有一个(非常?)大的视图,这导致了内存错误。我的body var看起来像这样:

var body: some View {
        ZStack {
            Color(...)            
            Rectangle()
            ScrollView {
                VStack {
                    ZStack {
                        RoundedRectangle(...)
                        RoundedRectangle(...)
                                             
                        VStack {
                            ZStack{
                                Circle()                                
                                Circle()
                                Circle()
                                Image(...)
                                
                            }.overlay(
                                 HStack {
                                     // more stuff
                                 }
                            )                            
                        }

                        // many more views
                    }
                }
            }
        }
}

我添加和删除视图,以确认这是一个与视图过多有关的问题。在某个时候,当我添加另一个视图时,我得到以下(或类似的)内存错误:
Thread 1: EXC_BAD_ACCESS (code=2, address=0x16cd27fc8)
每次的地址似乎都不一样,但总是以0x16开始,这让我相信这是一个堆栈溢出......我发现this answer/question有一个非常相似的问题,并能够通过将大型结构体移动到堆中来解决它。我不确定如何确切地完成这一点,即使在查看了答案中提供的示例之后。
我的主要想法是,必须有一个更好的方式来组织我的身体摆在首位,我只是失踪。使用堆真的有必要渲染视图与许多儿童?任何帮助或建议是感激。

yv5phkfx

yv5phkfx1#

body有10个视图限制,将body分解为尽可能小的自定义子视图(基于每个视图使用的let/@State变量)。

7gcisfzg

7gcisfzg2#

使用LazyVstack而不是Vstack,它只加载我们在屏幕上看到的视图。

var body: some View {
        ZStack {
            Color(...)            
            Rectangle()
            ScrollView {
//Vstack load the whole content at a time while LazyVstack load as its needed 
                LazyVStack{ 
                    ZStack {
                        RoundedRectangle(...)
                        RoundedRectangle(...)
                                             
                        VStack {
                            ZStack{
                                Circle()                                
                                Circle()
                                Circle()
                                Image(...)
                                
                            }.overlay(
                                 HStack {
                                     // more stuff
                                 }
                            )                            
                        }

                        // many more views
                    }
                }
            }
        }
}

相关问题