NSObject继承类使应用程序崩溃

时间:2010-10-17 18:41:53

标签: objective-c cocos2d-iphone

我是Objective-C的新手,这是我的问题: 我想写一个游戏,我想使用GameStateManager类来管理游戏状态。正如我所读到的,Objective-C中的每个类都应该继承自NSObject或它的子类。所以这是GameStateManager接口:

@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信号。有什么问题?

3 个答案:

答案 0 :(得分:2)

问题在于:

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

实际上,您无需拨打init即可致电alloc。我建议您忘记instance内容并使用官方init模式,直到您对内存管理感到满意为止:

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

...然后通过调用[[GameStateManager alloc] init]来获取您的实例。

答案 1 :(得分:1)

GameStateManager *manager = [GameStateManager init];

-(id)init是一个实例方法,而不是类方法。该行应如下所示:

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

答案 2 :(得分:1)

问题是没有正确创建gameStateManager。而不是

[GameStateManager init]

使用

[[[GameStateManager alloc] init] autorelease]

自动释放用于良好的内存管理,实际上不会影响初始化。