Сцены не полностью выпущены в приложении Cocos2d для iPhone - отладка

У меня есть приложение для 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]?


person kender    schedule 23.02.2011    source источник


Ответы (2)


Не вызывать continueCount

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

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

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

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

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

person bbum    schedule 23.02.2011

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

person Kazuki Sakamoto    schedule 23.02.2011