2010-10-17 6 views
1

Je suis nouveau dans l'objectif-C et voici mon problème: Je veux écrire un jeu et je veux utiliser une classe GameStateManager pour gérer les états de jeu. Comme j'ai lu chaque classe dans Objective-C devrait être héritée de NSObject ou de sa sous-classe. Donc, est ici l'interface GameStateManager:NSObject hérité classe bloque l'application

@interface GameStateManager : NSObject { 
    int currentState_; 
} 
+(id) instance; 
-(void) setState:(int)state; 

@end 

Et voici la mise en œuvre:

@implementation GameStateManager 
+(id) instance 
{ 
    GameStateManager *manager = [GameStateManager init]; 
return manager; 
} 

- (id) init 
{ 
self = [super init]; 
return self; 
} 

- (void) setState: (int) state 
{ 
switch (state) 
{ 
    case GS_MAIN_MENU_START: 
    { 
//   MenuScene *menuScene = [MenuScene node]; 
//   [menuScene build: false]; 
     MenuScene *scene = [scene instance:self :false]; 
     [[CCDirector sharedDirector] runWithScene: scene]; 
    } 
     break; 

    case GS_PLAYING: 
    { 

    } 
     break; 
} 
} 

@end 

J'utilise cette classe ici:

gameStateManager = [GameStateManager instance]; 
[gameStateManager setState: GS_MAIN_MENU_START]; 

La deuxième ligne a généré un signal SIGABRT. Quel est le problème ?

+0

Il semble que vous essayez de créer un singleton. Si c'est vrai, vous le faites de la mauvaise façon. En outre, vérifiez votre gestion de la mémoire. –

Répondre

2

Le problème est ici:

+ (id) instance 
{ 
    GameStateManager *manager = [GameStateManager init]; 
    return manager; 
} 

En effet, vous appellent init sans jamais appeler alloc. Je recommande que vous oubliez les trucs instance et d'utiliser les init officielles modèles jusqu'à ce que vous êtes vraiment à l'aise avec la gestion de la mémoire:

- (id) init 
{ 
    self = [super init]; 
    if (self == nil) 
     return nil; 
    … 
    return self; 
} 

... puis obtenir votre instance en appelant [[GameStateManager alloc] init].

1
GameStateManager *manager = [GameStateManager init]; 

-(id)init est une méthode d'instance, pas une méthode de classe. Cette ligne devrait ressembler à ceci:

GameStateManager *manager = [[GameStateManager alloc] init]; 
+0

Hm, c'est une fuite de mémoire sauf si vous déclarez 'manager' comme étant statique, et vérifiez s'il est déjà créé avant d'appeler' + alloc'. – jlehr

1

Le problème est que le gameStateManager n'est pas créé correctement. Au lieu de

[GameStateManager init] 

utilisation

[[[GameStateManager alloc] init] autorelease] 

Le autorelease est pour une bonne gestion de la mémoire et n'affecte pas réellement l'initialisation.

+0

Vous êtes la réponse semble suggérer que la * autorelease * est nécessaire pour ce qu'il essaie d'atteindre. Je sais que ce n'est pas ce que tu voulais dire, mais ça ressemble à ça. –

+0

Je m'en suis rendu compte, et c'est pourquoi j'ai explicitement dit que c'était juste pour une bonne gestion de la mémoire. Mais merci pour le formatage que mieux pour moi, j'étais sur un iPad. StackOverflow n'était pas vraiment fait pour les iPads. –

Questions connexes