如何解决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 举报,一经查实,本站将立刻删除。