Cocos2d iphone ';NSInvalidArgumentException';,原因:'-[MenuScene距离]:替换场景时

Cocos2d iphone ';NSInvalidArgumentException';,原因:'-[MenuScene距离]:替换场景时,cocos2d-iphone,singleton,layer,sigabrt,Cocos2d Iphone,Singleton,Layer,Sigabrt,在我的代码中,我制作了一个GameManager单例,它有一个负责更改场景的方法。我调用的第一个场景是MenuScene,然后我用游戏场景替换它。执行此操作时,控制台输出显示: 2013-10-07 19:40:55.895 MyGame[56164:a0b] -[MenuScene distance]: unrecognized selector sent to instance 0xb460690 2013-10-07 19:40:56.011 MyGame[56164:a0b] *** T

在我的代码中,我制作了一个GameManager单例,它有一个负责更改场景的方法。我调用的第一个场景是MenuScene,然后我用游戏场景替换它。执行此操作时,控制台输出显示:

2013-10-07 19:40:55.895 MyGame[56164:a0b] -[MenuScene distance]: unrecognized selector sent to instance 0xb460690
2013-10-07 19:40:56.011 MyGame[56164:a0b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MenuScene distance]: unrecognized selector sent to instance 0xb460690'
从日志中,我不明白为什么我会得到
-[MenuScene distance]…
,因为距离是游戏场景的属性,而不是MenuScene

以下是用于更改场景的GameManager方法:

-(void)runSceneWithID:(SceneTypes)sceneID {
SceneTypes oldScene = currentScene;
currentScene = sceneID;
//NSString* str;
id sceneToRun = nil;
switch (sceneID)
{
    case kBeginScene:
        sceneToRun = [BeginScene node];
         break;
    case kGameScene:
        sceneToRun = [GameScene node];
        break;

    case kMenuScene:
        sceneToRun = [MenuScene node];
        break;

    default:
        CCLOG(@"Unknown ID, cannot switch scenes");
        return;
        break;
}

if (sceneToRun == nil) {
    // Revert back, since no new scene was found
    currentScene = oldScene;
    return;
}


if ([[CCDirector sharedDirector] runningScene] == nil) {
    [[CCDirector sharedDirector] runWithScene:sceneToRun];

} else {

    [[CCDirector sharedDirector] replaceScene:sceneToRun];
}
}

此外,替换场景的调用位于作为MenuScene一部分的层类中。见下文:

-(void)startGameScene {
[[GameManager sharedGameManager] runSceneWithID:kGameScene];

}

请提供帮助。

您收到此消息是因为
距离
消息已发送到
MenuScene
实例,该实例没有此选择器(
游戏场景
显然有)

因此,可能在场景中的某个地方,管理singleton出现了一些问题,而您仍然(或已经)有一个MenuScene实例,您希望在其中有一个GameSecene实例

在Xcode中添加一个以查看消息的确切来源

PS:在全局实例(如单例)中管理场景时,要非常小心。如果在全局实例/变量中保留对场景(或任何节点)的强引用,则很容易泄漏内存。确保每个场景都使用日志实现了dealloc方法,以查看它是否确实进行了释放