0

cocos2dを使ってゲームを作っています。ゲーム作成時に呼び出されるメソッドは次のとおりです。

- (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. アプリケーションがクラッシュします。

常にcadeのさまざまな部分でクラッシュしますが、常に「EXC_BAD_ACCESS」例外が発生します。

4

2 に答える 2

1

[self.controllers release];メソッドから削除しdestroyGameます。あなたがすでに呼び出しself.controllers = nil;ているように、あなたのために必要な仕事をします。

于 2012-05-14T07:30:05.177 に答える
0

Rishi の提案に似ていますが、最初の割り当てにも問題があります。

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;
于 2012-05-14T16:26:57.150 に答える