2010-09-14 4 views
0

В моем приложении cocos2d я прошел через него с помощью инструментов и удалил все утечки памяти. У меня есть игра, показывающая, сколько памяти используется на экране, и она постоянно растет по мере продвижения игры до тех пор, пока у меня не закончится память. Количество объектов на экране не увеличивается на каждом уровне. Это довольно простая игра, поэтому я не должен так быстро исчерпывать память.Нет утечек памяти, но все еще не хватает памяти?

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

Какие-нибудь идеи в чем проблема?

ответ

0

Основная проблема заключается в том, что Sprites не освобождаются в cocos2d, если все действия не были остановлены на этих спрайтах. Это делается с помощью stopAllActions. Приветствия за все предложения.

3

Просто потому, что приборы не показывают утечек, не означает, что вы все еще не выделяете память, которую вы не используете. Обратите внимание на график ObjectAlloc и посмотрите, постоянно ли он растет, не падая.

1

Если вы выделили память, которую вы не используете и не можете ее очистить, это так же плохо, как утечка, даже если вы не получили ничего технически, потому что вы где-то скрывали какую-то неиспользуемую ссылку.

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

+0

Насколько я знаю, я очищаю всю память, которую я сейчас не использую. У меня есть несколько NSMutableArrays разных объектов, и в конце каждого уровня они очищаются, а затем освобождаются. Все в игровых слоях также удаляются в конце каждого уровня, поэтому все, что находится в пределах тех слоев, которые не освобождаются, будет считаться утечкой инструментами. – Tiddly

1

В Objective-C при использовании объектов автоопределения опасайтесь круговых зависимостей!

Если вы создаете объект A, а затем экземпляр объекта B и передаете ему A, чтобы B сохранил A, и A также сохраняет B (например, добавив его как дочерний элемент в A), вы можете легко настроить круговую и поэтому оба объекта не будут выпущены.

Совет: добавьте метод dealloc (void) для всех классов сцены и установите там точку останова. Если вы меняете сцену, и ее метод dealloc не вызывается после завершения смены сцены, вы пропускаете эту сцену (она не выпущена).

Попробуйте найти эту утечку, ища установку, аналогичную той, которую я описал выше.

+0

Я действительно не думаю, что у меня есть круговые зависимости в моем коде. – Tiddly

+0

У меня уже есть методы dealloc во всех моих классах сцены, и я поставил там точки останова, а также проверил счет сохранения до того, как вызывается [super dealloc], и это 1, что звучит прямо для меня. – Tiddly

1

Будьте осторожны с автореализованными объектами, так как они не освобождаются немедленно. Если у вас есть разделы с большим количеством распределений и автореализацией, попробуйте использовать для них определенные пулы автозаполнения. Это случилось со мной при создании огромных деревьев решений (с использованием NSArrays) для игры AI.

1

Отличный способ проверки объектов, которые агрегируются в памяти, - использовать функциональные возможности инструмента «Новый кусок» (в Xcode 3.2.3).

Используйте обычный инструмент Allocations для вашего приложения. Выполните ряд повторяющихся событий, которые должны вернуться к известному состоянию (например, перейдите на один уровень вниз в навигационном контроллере и вернитесь). Каждый раз, когда вы это делаете, нажмите на кнопку Mark Heap на левой боковой панели инструмента Allocations (под заголовком раздела Heapshot Analysis).

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

Если вы накапливаете объекты, но они либо не протекают, либо пропускаются инструментом «Утечки», они должны отображаться здесь. Таким образом, я нашел несколько тонких накопителей памяти, особенно когда вы соединяете это с инструментом автоматизации пользовательского интерфейса, чтобы автоматизировать повторяющиеся действия, которые вы тестируете.