首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SwiftUI时UIViewControllerRepresentable内存泄漏

使用SwiftUI时UIViewControllerRepresentable内存泄漏
EN

Stack Overflow用户
提问于 2019-06-21 07:45:25
回答 1查看 2.7K关注 0票数 11

更新:截至beta4,问题仍然存在.

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

代码语言:javascript
复制
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)
            }
        }

    }
}

代表性实施如下:

代码语言:javascript
复制
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)")
    }

}

通过点击“正方形”按钮,SomeRepView被添加和删除交替。然而,相关的UIViewController从未发布过。这可以通过记录的消息看到,我也证实了仪器。

请注意,SomeRepView是正确发布的。只分配相应的视图控制器。

还请注意,调用了UIViewController.viewWillDissappear,也调用了UIViewControllerRepresentable.dismantleUIViewController

这是反复按正方形按钮的典型输出。

代码语言:javascript
复制
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。

我试着触发模拟内存警告。没有效果。控制员还在。文书是我的见证;-)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-06 16:13:37

在Xcode 11,beta 5中,bug被修补。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56699009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档