我是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信号。有什么问题?
答案 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]
自动释放用于良好的内存管理,实际上不会影响初始化。