SwiftUI не освобождает память для удаленных ячеек в списке - PullRequest
2 голосов
/ 25 марта 2020

Если вы создаете список следующего представления в виде строк:

struct ImageCellView: View {
    let image: UIImage

    init(image: UIImage) {
        self.image = image
    }

    var body: some View {
        return Image(uiImage: image).frame(height: 128).clipped()
    }
}

После удаления ячеек память для UIImage не освобождается, пока не будут добавлены новые ячейки. Глядя на график памяти, мы можем выяснить, что AGGraphStorage содержит ссылку на это:

Даже если добавление новых ячеек может каким-то образом освободить память, UIImage изредка просачивалась:

Это ошибка в SwiftUI? Есть ли способ избавиться от этого поведения?

1 Ответ

1 голос
/ 25 марта 2020

Это ошибка в SwiftUI?

Нет, это не так. List кэширует строки для повторного использования и повышения производительности.

Есть ли способ избавиться от этого поведения?

Да,

a) не сохраняйте UIImage в элементе

b) управляйте UIImage в другом месте и сохраняйте структуру как weak var image: UIImage?

c) обрабатывайте это в строке .onDisappear

d) игнорировать это, потому что List кэширует не больше строк, чем помещается на экране, поэтому он будет сброшен при использовании этой строки для другого изображения

Мои предпочтительные a) и d) в зависимости от варианта использования.

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