2012-05-14 2 views
0

Я создаю игру, используя cocos2d. Вот метод, названный когда игра Создание:сбой приложений после второй CCScene, заменяющий

- (void)createGame 
{ 
    GameScene *newScene = [[GameScene alloc] initWithController:self]; //subclass of CCScene 

    if ([CCDirector sharedDirector].runningScene) 
     [[CCDirector sharedDirector] replaceScene:newScene]; 

    else 
     [[CCDirector sharedDirector] pushScene:newScene]; 

    scene = newScene; 

    //some controllers for some layers of my scene 
    box2d = [[Box2DController alloc] initWithParent:self]; 
    menu = [[MenuController alloc] initWithParent:self]; 
    controls = ([[ControlsController alloc] initWithParent:self]); 

    self.controllers = [[NSArray alloc] initWithObjects:box2d, menu, controls, nil]; 

    //some object, contains some parameters. rizeEvent tells about some event to all controllers. In this case, it sends pointer to worldState to all of them. 
    worldState = [[WorldState alloc] init]; 
    EventArgs *eventArgs1 = [[EventArgs alloc] initWithSender:self params:worldState]; 
    [self riseEvent:@"WorldStateUpdate" withArgs:eventArgs1]; 
} 

У меня есть кнопка, которая разрушает мой мир, и создает новый один:

- (void)onExitPressedWithArgs:(EventArgs *)e 
{ 
    [self destroyGame]; 
    [self createGame]; 
} 

Вот 'destroyGame' метод:

- (void)destroyGame 
{ 
    [box2d release]; 
    [menu release]; 
    [controls release]; 
    [scene release]; 
    [worldState release]; 

    box2d = nil; 
    menu = nil; 
    controls = nil; 
    scene = nil; 
    worldState = nil; 

    [self.controllers release]; 
    self.controllers = nil; 
} 

Итак, я запускаю свои заявки:

  1. 'CreateGame' называется
  2. нажатием кнопки 'перезагрузка'
  3. 'onExitPressedWithArgs' называется
  4. 'destroyGame' и 'createGame' называются
  5. Новый мир, созданный, все идет тонкая кнопка
  6. нажатием 'перезагрузки', 'onExitPressedWithArgs', 'destroyGame' и 'createGame' называются
  7. Сбой приложений.

Он всегда срабатывает в разных частях кайда, но всегда с исключением "EXC_BAD_ACCESS".

ответ

1

remove [self.controllers release]; от destroyGame способ. Как вы уже звоните self.controllers = nil;, который сделает вам необходимую работу.

+0

+1 на rishi для объяснения – samfisher

+0

Спасибо за ответ и совет. Я не думаю, что это проблема моей проблемы, но я сделал это. Проблема не исчезла. Почему он сбивает все подряд артер * вторая * замена? – SentineL

+0

Вы пробовали использовать NSZombie? – rishi

0

Как и предложение Риши, но есть проблема с начальным назначением.

1) Заменить следующим образом:

self.controllers = [[NSArray alloc] initWithObjects:box2d, menu, controls, nil]; 

с этим:

controllers = [[NSArray alloc] initWithObjects:box2d, menu, controls, nil]; 

2) И это:

[self.controllers release]; 
self.controllers = nil; 

с:

[controllers release]; 
controllers = nil; 
Смежные вопросы