У меня есть приложение, которое выполняет манипуляции с SCNNode
s в цикле - память приложения уходит до 2 ГБ и вылетает.Мой настоящий цикл очень сложен - он включает в себя обновление simdWorldTransform
узлов, а также удаление и добавление узлов.
Чтобы упростить его до такой степени, что я могу задать этот вопрос, я сделал простой пример, когда при нажатии кнопки он выполняет очень простые действия, такие как извлечение дочернего узла SCNNode - он все еще достигает 2 ГБ исбои.
Функция:
func memoryLeakDetect() {
for i in 1..<2001 {
if i % 10 == 0 {
print("Iteration = \(i)")
}
simpleLoop()
}
}
simpleLoop()
:
func simpleLoop() {
for i in 0..<10000 {
let pickIndex = 1
let pickLabelComp = saLabelComponents[pickIndex]
let pickSprite = LabelCompUtils.extractSprite(from: pickLabelComp) //MARK: CAUSING MEMORY LEAK!!!!
// let pickSprite = saSprites[pickIndex]
}
}
Кажется, что виновником является вызов extractSprite
- потому что, если я уберу этохраня ссылки на спрайт в массиве, программа больше не падает.Я включаю метод extractSprite
.Я совершенно ошеломлен, почему это вызывает неограниченный рост памяти.Что вызывает этот взрыв памяти?Я просто ищу узел?После выхода из итерации не должно быть никаких закулисных ссылок?
class LabelCompUtils {
static func extractSprite(from labelComponent: SCNNode) -> SCNNode {
if let sprite: SCNNode = labelComponent.childNode(withName: "sprite", recursively: false) {
return sprite
} else {
return SCNNode()
}
}