Это, по-видимому, связано с встраиванием мутации в ForEach, которая при просмотре графиков памяти может включать List (который также , похоже, имеет утечку памяти, когда его элементы видоизменяются ). Я рекомендую открыть Отзыв по этому вопросу.
Это можно устранить, удалив ForEach:
func square(at offset: Int) -> some View {
let mySquare = mySquares[offset]
return MySquareView()
.offset(x: mySquare.offsetX,
y: mySquare.offsetY)
}
var body: some View {
VStack {
ZStack {
square(at: 0)
square(at: 1)
square(at: 2)
square(at: 3)
}
.scaleEffect(0.8)
}
}
Вы также можете взломать этот путь путем внедрения рекурсивного AnyView вместо использования ForEach. Могут быть и другие умные решения, подобные этому; это может стоить исследовать дальше, так как потеря ForEach и List довольно неприятна.
func loopOver<C: Collection, V: View>(_ list: C, content: (C.Element) -> V) -> AnyView
{
guard let element = list.first else { return AnyView(EmptyView()) }
return AnyView(Group {
content(element)
loopOver(list.dropFirst(), content: content)
})
}
var body: some View {
VStack {
ZStack {
loopOver(mySquares) { MySquareView().offset(x: $0.offsetX, y: $0.offsetY )}
}
.scaleEffect(0.8)
}
}
(Подобное использование AnyView помешает различным оптимизациям SwiftUI, так что это последнее средство, но в этом на случай, если это, вероятно, необходимо.)