Утечка памяти SwiftUI при использовании UIViewControllerRepresentable - PullRequest
1 голос
/ 21 июня 2019

ОБНОВЛЕНИЕ: Начиная с бета4 проблема все еще существует.

Я создал очень простой пример того, как UIViewController, представленный UIViewControllerRepresentable, никогда не освобождается.

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)")
    }

}

Нажатием на кнопку «Квадрат» альтернативно добавляется и удаляется SomeRepView. Однако связанный UIViewController никогда не выпускается. Это видно по зарегистрированным сообщениям, и я также подтвердил это с помощью Инструментов.

Обратите внимание, что SomeRepView выпущен правильно. Только соответствующий контроллер представления остается выделенным.

Также обратите внимание, что 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, бета-версия 4.

Я попытался вызвать Предупреждение о симуляции памяти . Нет эффекта. Контроллеры сохраняются. Инструменты мой свидетель; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...