SwiftUI - возможная утечка памяти - PullRequest
1 голос
/ 23 сентября 2019

Я недавно начал изучать SwiftUI и пробежал несколько учебников, которые рекомендуют менять представления на основе состояния (см. Фрагмент ниже).Тем не менее, я заметил, что при отладке использование памяти медленно приближается даже к самому базовому интерфейсу.Это может быть просто недостаток знаний, но неправильно ли менять местами представления таким образом с помощью SwiftUI?

Version 11.0 (11A420a) - iOS 13

// Memory Leak Test
struct ContentView: View {
    @State private var toggle = false

    func cycleViews() {
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            self.toggle = !self.toggle
            self.cycleViews()
        }
    }

    var body: some View {
        Group {
            if toggle {
                ViewA()
            } else {
                ViewB()
            }
        }.onAppear {
            self.cycleViews()
        }
    }
}

struct ViewA: View {
    var body: some View {
        VStack {
            Text("Some Content")
            Text("Some Content")
            Text("Some Content")
            Text("Some Content")
            Text("Some Content")
        }
    }
}

struct ViewB: View {
    var body: some View {
        List {
            Text("Some Content")
            Text("Some Content")
            Text("Some Content")
            Text("Some Content")
            Text("Some Content")
        }
    }
}

1 Ответ

0 голосов
/ 24 сентября 2019

Ваш код представляется вполне приемлемым SwiftUI, и где-то, похоже, есть утечка памяти, поскольку переключение туда-сюда (даже с ручным Toggle() вместо вызова asyncAfter()) приводит к увеличению памяти.

Я считаю, что это ошибка со списком, потому что если вы измените список на другой тип представления, проблема исчезнет, ​​и я не заметил этого при использовании этого же шаблона со всеми другими видами представлений.

Я бы порекомендовал вам файл обратной связи с Apple и опубликуйте здесь номер отзыва, чтобы другие пострадавшие могли подать свое собственное и сослаться на него.

...