Objective c NSObject继承类使应用程序崩溃

Objective c NSObject继承类使应用程序崩溃,objective-c,cocos2d-iphone,Objective C,Cocos2d Iphone,我是objective-C的新手,我的问题是: 我想写一个游戏,我想使用GameStateManager类来管理游戏状态。正如我所读到的,Objective-C中的每个类都应该继承自NSObject或其子类。下面是GameStateManager界面: @interface GameStateManager : NSObject { int currentState_; } +(id) instance; -(void) setState:(int)state; @end 以下是实施

我是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信号。有什么问题吗

GameStateManager *manager = [GameStateManager init];
-(id)init
是一个实例方法,而不是类方法。这条线应该是这样的:

GameStateManager *manager = [[GameStateManager alloc] init];
-(id)init
是一个实例方法,而不是类方法。这条线应该是这样的:

GameStateManager *manager = [[GameStateManager alloc] init];
问题在于:

+ (id) instance
{
    GameStateManager *manager = [GameStateManager init];
    return manager;
}
实际上,您正在调用
init
,而从未调用过
alloc
。我建议您忘记
实例
之类的东西,使用官方的
init
模式,直到您真正熟悉内存管理:

- (id) init
{
    self = [super init];
    if (self == nil)
        return nil;
    …
    return self;
}
…然后通过调用
[[GameStateManager alloc]init]

获取您的实例问题在于:

+ (id) instance
{
    GameStateManager *manager = [GameStateManager init];
    return manager;
}
实际上,您正在调用
init
,而从未调用过
alloc
。我建议您忘记
实例
之类的东西,使用官方的
init
模式,直到您真正熟悉内存管理:

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

…然后通过调用
[[GameStateManager alloc]init]

获取实例问题是GameStateManager没有正确创建。而不是

[GameStateManager init]
使用


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

问题在于gameStateManager的创建不正确。而不是

[GameStateManager init]
使用


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

看起来您正在尝试创建单例。如果这是真的,那你就错了。此外,请检查内存管理。看起来您正在尝试创建单例。如果这是真的,那你就错了。此外,检查你的内存管理。你的答案似乎表明,自动释放是他试图实现的目标所必需的。我知道这不是你想说的,但看起来是这样。我意识到了这一点,这就是为什么我明确地说这只是为了更好的内存管理。但感谢你为我设置了更好的格式,我当时在iPad上。StackOverflow并不是真正为iPad设计的。你的答案似乎表明,他想要实现的目标需要自动释放。我知道这不是你想说的,但看起来是这样。我意识到了这一点,这就是为什么我明确地说这只是为了更好的内存管理。但感谢你为我设置了更好的格式,我当时在iPad上。StackOverflow并不是为iPad设计的。嗯,这是内存泄漏,除非您将
管理器
声明为静态,并在调用
+alloc
之前检查它是否已经创建。嗯,这是内存泄漏,除非您将
管理器
声明为静态,并在调用
+alloc
之前检查它是否已经创建。