2010-10-17 18 views
1

我是新這裏是我的問題: 我想寫一個遊戲,我想用一個GameStateManager類來管理遊戲狀態。正如我讀過Objective-C中的每個類都應該從NSObject或它的子類繼承。因此,這裏的GameStateManager接口:NSObject的繼承類崩潰在Objective-C的應用

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

@end 

,這裏是實現:

@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 

我使用這個類在這裏:

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

第二行產生SIGABRT信號。有什麼問題 ?

+0

它看起來像你想創建一個單例。如果那是真的,那麼你做錯了。另外,檢查你的內存管理。 – 2010-10-17 18:51:05

回答

2

的問題是在這裏:

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

實際上你而沒有調用alloc調用init。我建議你忘了instance的東西,使用官方init模式,直到你與內存管理很舒服:

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

...然後通過調用[[GameStateManager alloc] init]得到您的實例。

1
GameStateManager *manager = [GameStateManager init]; 

-(id)init是一個實例方法,而不是一個類方法。這條線應該是這樣的:

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

嗯,這是一個內存泄漏,除非你聲明'manager'是靜態的,並檢查它是否調用'+ alloc'之前已經創建。 – jlehr 2010-10-17 20:54:01

1

的問題是,沒有被正確創建gameStateManager。取而代之的

[GameStateManager init] 

使用

[[[GameStateManager alloc] init] autorelease] 

自動釋放是良好的內存管理和實際上並不影響初始化。

+0

你的回答似乎表明* autorelease *是他試圖達到的目標所必需的。我知道這不是你想說的,但它看起來像這樣。 – 2010-10-17 19:16:17

+0

我意識到這一點,這就是爲什麼我明確表示它只是爲了良好的內存管理。但感謝格式更好,我在iPad上。 StackOverflow並不是真正爲iPad設計的。 – 2010-10-17 19:21:14