Сцены, выпущенные не полностью в приложении Cocos2d для iPhone - отладка - PullRequest
1 голос
/ 23 февраля 2011

У меня есть приложение для iPhone в Cocos2d, которое иногда вылетает на реальном устройстве из-за проблем с памятью.

Что я обнаружил, так это то, что сцены при переключении не высвобождаются полностью - для них [retainCount] составляет примерно 4-10 :)

dealloc метод никогда не вызывается, и тогда я предполагаю, что, когда я переключаю сцены несколько раз, появляется проблема с памятью.

Мне интересно - где мне выпустить сцену?Так как у него есть число детей, я полагаю, что я должен сделать их удаление.Но оказывается, что удаление всех дочерних элементов из слоя не уменьшает его количество.Я добавил такой фрагмент кода в мой cleanup метод:

- (void) cleanup {
    while ([self.children count] > 0) {
        CCLOG(@"child: %d - %@  rc: %d", 0, [self.children objectAtIndex:0], [[self.children objectAtIndex:0] retainCount]);
        [self removeChild:[self.children objectAtIndex:0] cleanup:YES];
    }
    [super cleanup];
}

Но тогда метод [self retainCount] все равно возвращает число больше 1 или 0, и мой dealloc не вызывается,

Что я должен сделать, чтобы правильно освободить этих детей?Если я добавлю свой собственный подкласс CCSprite как дочерний, должен ли я сделать что-то конкретное в методе release или dealloc этого класса, в другом случае, просто вызовя его [super] метод?

Ответы [ 2 ]

4 голосов
/ 23 февраля 2011

Не вызывайте retainCount

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

Вы должны освободить сцену для баланса, сколько бы раз вы не сохранилисцены, не больше и не меньше.

Если вы отпустите его больше, чем сохранили, ваше приложение, скорее всего, будет аварийно завершать работу всякий раз, когда вы [потенциально случайно] решаете реальную проблему.

В общем , когда вы имеете дело с иерархией элементов, таких как представления, слои или спрайты, вы удаляете корневой вид / слой / спрайт, и это удаление заботится о разрушении иерархии (включая освобождение по мере необходимости).).

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

1 голос
/ 23 февраля 2011

Обычно вам не нужно выпускать детей самостоятельно. Как вы добавляете своего ребенка?

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