2013-08-18 2 views
2

Я строю игру cocos2d, в котором после того, как две отдельные спрайты конфликтует (по простой технологии ограничительной рамки), я называюDealloc вызывает сбой в переходе между сценами в Cocos2D

[[CCDirector sharedDirector] replaceScene:gameOverScene];

, чтобы перейти к игре над сценой.

После того, как он инициализирует игру на сцену и все в нем, игре вылетает и идет к этому методу в ccArray.m классе:

void ccArrayRemoveAllObjects(ccArray *arr) { while(arr->num > 0) CC_ARC_RELEASE(arr->arr[--arr->num]); }

с сообщением: Темы 1: Программа получила сигнал: "EXC_BAD_ACCESS".

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

Мой update метод:

-(void)update:(ccTime)dt {

if (CGRectIntersectsRect(plane.boundingBox, enemy.boundingBox)) {
CCScene *gameOverScene = [GameOverLayer sceneWithWon:NO]; [[CCDirector sharedDirector] replaceScene:gameOverScene]; } }

Мой dealloc метод:

- (void) dealloc {

[super dealloc]; 

[_monsters release]; 
_monsters = nil; 
[mole release]; 
mole = nil; 
[text release]; 
text = nil; 
[mBG1 release]; 
mBG1 = nil; 
[mBG2 release]; 
mBG2 = nil; } 

У меня есть не знаю, почему это происходит. Пожалуйста помоги.

Спасибо вам в ожидании.

+0

Вы можете разместить свой метод dealloc класса игрового процесса или любого соответствующего кода аварии? – giorashc

+0

@giorashc Пожалуйста, снова просмотрите вопрос о коде. Я отредактировал его. – hyd00

ответ

1

Вы называете dealloc супер, прежде чем освобождать свою сцену игрового процесса. dealloc вызвать супер в конце вашего метода dealloc:

- (void) dealloc { 
    [_monsters release]; 
    _monsters = nil; 
    [mole release]; 
    mole = nil; 
    [text release]; 
    text = nil; 
    [mBG1 release]; 
    mBG1 = nil; 
    [mBG2 release]; 
    mBG2 = nil; 

    [super dealloc]; 
} 

Когда вы звоните супер-х dealloc первым вы отпускаете экземпляр, что делает его членами недействительной, так доступ к ним после dealloc создаст память плохих проблемы доступа

+0

Пробовал это. Но теперь он падает на строку '[super dealloc]'. – hyd00

+0

Я не уверен в этом, но могу ли вы поместить NSLog в свой метод dealloc и проверить, сколько раз этот журнал печатает на экране, когда тела сталкиваются – giorashc

+0

Он вызывается только один раз, когда спрайты сталкиваются, он загружает следующую сцену и после загружая его, он вызывает метод dealloc и сбой на '[super dealloc]'. Пожалуйста помоги.Я понятия не имею, как устранить эту проблему – hyd00

1

, потому что у вас недостаточно кода, я могу только догадываться, что некоторые из этих объектов, такие как _monsters, mole, text, mBG1, mBG2, были автореализованы до того, как вы отпустите их в dealloc funtion.So, они не могут быть выпущены more.This касается ARC-автоматического подсчета ссылок, который вы должны знать, это основа ios. попробовать это только:

- (void) dealloc { 

    [super dealloc]; 

}