cocos2d dealloc сцены никогда не вызывается после replaceScene - PullRequest
4 голосов
/ 13 августа 2011

У меня есть GameScene, где я добавляю большое изображение как ребенок.Я хочу заново создать GameScene для каждого уровня.Но после игры нескольких уровней, он получает предупреждение памяти и в конечном итоге падает.Метод dealloc никогда не вызывается.

начать с MainScene, при нажатии кнопки «Пуск» ->

[[CCDirector sharedDirector] replaceScene: [GameScene scene]];

при очистке уровня ->

[[CCDirector sharedDirector] replaceScene: [WinScene scene]];

при нажатии кнопки «Далее» ->

[[CCDirector sharedDirector] replaceScene: [GameScene scene]];

и т. Д ... Но дело GameScene никогда не запускается.(MainScene и WinScene в порядке)

для GameScene У меня есть

static GameScene* instanceOfGameScene;

другие соответствующие методы: (Я не думаю, что это instanceOfGameScene, который сохранил GameScene, поскольку он является общимПодходи ко мне, ОК в других моих проектах.)

-(id) init {
if ((self = [super init])) {

    instanceOfGameScene = self;
etc...


-(void) dealloc {
    CCLOG(@"game scene get dealloc'ed");
    instanceOfGameScene = nil;
    [super dealloc];
}



+(GameScene*) sharedScene
{
    return instanceOfGameScene;
}

В WinScene я выполняю [[GameScene sharedScene] removeAllChildrenWithCleanup: YES] через 5 секунд, метод dealloc в GameScene наконец-то запускается,с программой принятый сигнал: «EXC_BAD_ACCESS».в последней строке - (void) removeAllChildrenWithCleanup: (BOOL) метод очистки в классе CCNode:

[children_ removeAllObjects];

стек глубже, ошибка - CCArray1026 *

/** Removes all objects from arr */
static inline void ccArrayRemoveAllObjects(ccArray *arr)
{
    while( arr->num > 0 )
        [arr->arr[--arr->num] release]; 
}

Ответы [ 2 ]

2 голосов
/ 04 сентября 2011

проблема решена.Я поместил кнопки (с объявлением блока, которые могут сохранять некоторые объекты GameScene) в метод onEnter и удалил его в методе onExit вместо того, чтобы просто помещать все вещи в метод init.это может звучать странно, но это работает сейчас.^ _ ^ Счастлив после целого дня отладки.

0 голосов
/ 16 августа 2011

Нет причин для GameScene быть синглтоном;конечно не плохо созданный синглтон.Скорее всего, это не плохо созданный синглтон, который отключается перед вызовом [super dealloc].Абсолютно наверняка не плохо созданный синглтон, который даже не используется должным образом.Цель синглтона состоит в том, чтобы иметь класс, который инициализируется ОДИН РАЗ в течение приложения, а не жизни самого класса.

Если исправление синглтона так, что это обычный класс, не решает проблемутогда ваша проблема в коде, который вы нам не показывали.

Кроме того, вы можете нажать CCTextureCache, чтобы освободить неиспользуемые текстуры после того, как вы освободили свой GameScene.Это поможет вам с аспектом памяти.

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