0

シーンコントローラー(ステートマネージャー)クラスでシーンを切り替えるシンプルなアプリの作成を練習しています。

シーンを作成しました:

+(CCScene *) scene
{
    CCScene *scene = [CCScene node];

    GameMenu *layer = [GameMenu node];

    [scene addChild: layer];

    return scene;
}

-(id)init{
    if ((self = [super init])){
        self.isTouchEnabled = YES;
        CGSize winSize = [[CCDirector sharedDirector] winSize];
        gameMenuLabel = [CCLabelTTF labelWithString:@"This is the Main Menu. Click to Continue" fontName:@"Arial" fontSize:13];
        gameMenuLabel.position = ccp(winSize.width/2, winSize.height/1.5);
        [self addChild:gameMenuLabel];
    }

    return  self;
}

-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"ccTouchesBegan: called from MainMenu object");
    [[StateManager sharedStateManager] runSceneWithID:kGamePlay];

}

-(void)dealloc{
    [gameMenuLabel release];
    gameMenuLabel = nil;

    [super dealloc];
}

@end

しかし、私はこの警告を受け取り続けます:https ://dl.dropbox.com/u/1885149/Screen%20Shot%202012-10-06%20at%205.23.43%20PM.png (おそらくあまり助けにはなりませんが、私がそうするだろうと考えましたスクリーンショットをリンクします。

それはdeallocと関係があると思います。シーンでdeallocをコメントアウトしても、この警告は表示されません。どんな助けでも大歓迎です、ありがとう。

これは、シーンを切り替えるための私のステートマネージャーの方法です。

-(void)runSceneWithID:(SceneTypes)sceneID {
    SceneTypes oldScene = currentScene;
    currentScene = sceneID;
    id sceneToRun = nil;
    switch (sceneID) {
        case kSplashScene:
            sceneToRun = [SplashScene node];
            break;

        case kGameMenu:
            sceneToRun = [GameMenu node];
            break;
        case kGamePlay:
            sceneToRun = [GamePlay node];
            break;
        case kGameOver:
            sceneToRun = [GameOver node];
            break;

        default:
            CCLOG(@"Unknown ID, cannot switch scenes");
            return;
            break;
    }
    if (sceneToRun == nil) {
        // Revert back, since no new scene was found
        currentScene = oldScene;
        return;
    }    
    if ([[CCDirector sharedDirector] runningScene] == nil) {
        [[CCDirector sharedDirector] runWithScene:sceneToRun];
    } else {
        [[CCDirector sharedDirector] replaceScene:sceneToRun];
    }
}
4

1 に答える 1

1

次のように、retain プロパティを gameMenuLabel に与える必要があります

@property (nonatomic, retain) CCLabelTTF* gameMenuLabel; //in .h file

そしてこう書いて……。

    self.gameMenuLabel = [CCLabelTTF labelWithString:@"This is the Main Menu. Click to Continue" fontName:@"Arial" fontSize:13];

これの代わりに...

    gameMenuLabel = [CCLabelTTF labelWithString:@"This is the Main Menu. Click to Continue" fontName:@"Arial" fontSize:13];

問題は、自動解放されたオブジェクトを gameMenuLabel に渡してから、dealloc セクションでそのオブジェクトを再度解放していることです。したがって、クラッシュ。

于 2012-10-07T07:01:11.823 に答える