gpt4 book ai didi

使用 UIViewControllerRepresentable 时发生 SwiftUI 内存泄漏

转载 作者:行者123 更新时间:2023-12-02 11:52:41 26 4
gpt4 key购买 nike

更新:从 beta4 开始,问题仍然存在。

我创建了一个非常简单的示例,说明由 UIViewControllerRepresentable 表示的 UIViewController 如何从不释放。

import SwiftUI

struct ContentView : View {
@State private var showRepView = true

var body: some View {
VStack {
Text("Square").font(.largeTitle).tapAction {
self.showRepView.toggle()
}

if showRepView {
SomeRepView().frame(width: 100, height: 100)
}
}

}
}

表示实现如下:

import SwiftUI

struct SomeRepView: View {
var body: some View {
RepViewController()
}
}

struct RepViewController: UIViewControllerRepresentable
{
func makeUIViewController(context: Context) -> SomeCustomeUIViewController {
let vc = SomeCustomeUIViewController()
print("INIT \(vc)")
return vc
}

func updateUIViewController(_ uiViewController: SomeCustomeUIViewController, context: Context) {
}

static func dismantleUIViewController(_ uiViewController: SomeCustomeUIViewController, coordinator: Self.Coordinator) {
print("DISMANTLE")
}

}

class SomeCustomeUIViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.green
}

override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print("viewWillDissapear \(self)")
}

deinit {
print("DEINIT \(self)")
}

}

通过点击“Square”按钮,可以交替添加和删除SomeRepView。然而,相关的 UIViewController 从未被释放。这可以通过记录的消息看到,我也通过 Instruments 进行了确认。

请注意,SomeRepView 已正确发布。只有相应的 View Controller 仍然被分配。

另请注意,调用了 UIViewController.viewWillDissappear 以及 UIViewControllerRepresentable.dismantleUIViewController

这是重复按下方形按钮的典型输出。

INIT <SomeCustomeUIViewController: 0x100b1af70>
DISMANTLE
viewWillDissapear <SomeCustomeUIViewController: 0x100b1af70>
INIT <SomeCustomeUIViewController: 0x100a0a8c0>
DISMANTLE
viewWillDissapear <SomeCustomeUIViewController: 0x100a0a8c0>
INIT <SomeCustomeUIViewController: 0x100b23690>
DISMANTLE
viewWillDissapear <SomeCustomeUIViewController: 0x100b23690>

如图所示,DEINIT 永远不会被打印。

我的问题是...这是一个错误吗?还是我做错了什么?

运行 iOS13 beta 4。

我尝试触发模拟内存警告。没有效果。 Controller 仍然存在。仪器是我的见证人;-)

最佳答案

在 Xcode 11 beta 5 中,错误已修复。

关于使用 UIViewControllerRepresentable 时发生 SwiftUI 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56699009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com