Утечки памяти из-за подкласса SKScene

#swift #xcode #debugging #memory-leaks #sprite-kit

#swift #xcode #отладка #утечки памяти #sprite-kit

Вопрос:

Я использую Xcode8 и Swift 3 . После создания нового SpriteKit проекта верхняя часть GameScene.swift определяется GameScene как дочерний класс SKScene .

Когда проект выполняется в симуляторе, я нажимаю символ для графика памяти отладки (три маленьких соединенных кружка над областью отладки). Как и ожидалось, проблем с памятью нет.

Теперь я добавляю новый класс (называемый ParentScene) в GameScene.swift:

У GameScene появился новый родительский элемент

Теперь SKScene является родительским элементом ParentScene, а ParentScene является новым родительским элементом GameScene. Запуск этого проекта в симуляторе и захват графика памяти приводит к следующим проблемам:

проблемы с памятью

При запуске проекта на моем iPhone вместо этого график памяти не сообщает о каких-либо утечках объектов. Мой фактический SpriteKit игровой проект также реализует родительскую сцену между SKScene и GameScene и вызывает проблемы с памятью в симуляторе И на моем устройстве.

В чем причина утечки объектов?

Комментарии:

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

2. Привет @Knight0fDragon, возможно, это недоразумение. Вы написали: «Вы можете легко проверить это, создав новый проект, …» Но это именно то, что я делал: я долго отлаживал свой игровой проект, удаляя все больше и больше своего кода, чтобы скрыть причину утечек памяти, но безуспешно. Итак, я решил подойти к проблеме с противоположной стороны и создал чистый, новый SpriteKit проект. Я был полностью удивлен, вызвав эти утечки памяти только путем добавления пустого класса между GameScene и SKScene . Вы говорите: «Лучше проанализируйте свой код» … Какой код?

3. Вы определенно этого не делаете, создаете совершенно новый проект и добавляете только родительский класс. Вы увидите, что он не протекает, он не может протекать, потому что даже не добавлены все те вещи, которые, как вы утверждаете, протекают. Если вы получаете утечку, удалите Xcode, потому что на вашем компьютере что-то испортилось.

4. @Knight0fDragon, я не говорю, что эти утечки действительно существуют, я просто описываю вывод отладчика. Теперь я переключился на свой старый Mac, обновился до Sierra, полностью удалил Xcode7 , установил Xcode8 , создал новый, нетронутый SpriteKit проект, запустил его в симуляторе iPhone7, записал график памяти: утечек нет. После нажатия пустого класса между GameScene и SKScene : длинный список утечек. После удаления пустого класса: опять же, нет списка утечек. Кстати, вывод отладчика для «протекающего» проекта не является детерминированным, он меняется от запуска к запуску.

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