微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI - 内存管理

如何解决SwiftUI - 内存管理

好的,所以我希望改善我的应用程序中的内存。

我已为我的项目启用了 Live Memory Allocation,并且我正在使用 Debug Graph Tool。我正在查看回溯,并遇到问题,老实说,这对我来说没有意义。据我所知,我已经删除了强引用,但我的代码部分出现了问题,我只是不理解/看到问题。例如:

struct ProductScrollView: UIViewRepresentable {
    private let view = UIScrollView()
    func makeCoordinator() -> Coordinator {
        return ProductScrollView.Coordinator(parent1: self)
    }
    @State var currentPage: Int
    @Binding var products: [ProductModel]
    func makeUIView(context: Context) ->  UIScrollView {

        if view.superview == .none {
        let childView = UIHostingController(rootView: ProductCell(products: $products,currentPage: currentPage,pageCount: products.count)
        ) <---- Debugger seems to indicate this with the message "Thread 1"



        childView.view.frame = CGRect(x: 0,y: 0,width: UIScreen.main.bounds.width,height: UIScreen.main.bounds.height * CGFloat((products.count)))
        view.contentSize = CGSize(width: UIScreen.main.bounds.width,height: UIScreen.main.bounds.height * CGFloat((products.count)))
        
        view.addSubview(childView.view)
        view.showsverticalScrollIndicator = false
        view.showsHorizontalScrollIndicator = false
        view.contentInsetAdjustmentBehavior = .never
        view.isPagingEnabled = true
        view.delegate = context.coordinator
        }
        return view
    }
    func updateUIView(_ uiView: UIScrollView,context: Context) {
        uiView.contentSize = CGSize(width: UIScreen.main.bounds.width,height: UIScreen.main.bounds.height * CGFloat((products.count)))
        for i in 0..<uiView.subviews.count {
            uiView.subviews[i].frame = CGRect(x: 0,height: UIScreen.main.bounds.height * CGFloat((products.count)))
        }
    }
    
    class Coordinator: NSObject,uiscrollviewdelegate {
        var parent: ProductScrollView

        init(parent1: ProductScrollView){
            parent = parent1
        }
        
        func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
            let index = Int(scrollView.contentOffset.y / UIScreen.main.bounds.height)
            parent.currentPage = index
      
        }

        deinit {
            print("Coordiante scroll view desroted")
        }
    }
}

这对我来说并不完全有意义,但是,我相信这条线:

 return ProductScrollView.Coordinator(parent1: self)

可能是问题吗?

我什至会让调试器指向在我的 onAppear 方法上执行的函数

有人可以帮助我做些什么来更好地了解这些问题并消除它们吗?

编辑 -

为了进一步深入研究,这条线出现在我的回溯中:

static var FeedBACK = FeedbackAPI()

是不是每次都新建一个实例?

解决方法

根据设计,我们需要在 makeView 内实例化视图,因此 SwiftUI 管理 UIView 提升周期与可表示视图相同,例如

struct ProductScrollView: UIViewRepresentable {

    func makeCoordinator() -> Coordinator {
        return ProductScrollView.Coordinator(parent1: self)
    }

    @State var currentPage: Int
    @Binding var products: [ProductModel]

    func makeUIView(context: Context) ->  UIScrollView {
        let view = UIScrollView()   // << here !!

// ... other code
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。