Ios 使用调度块时EXC\u访问错误\u

Ios 使用调度块时EXC\u访问错误\u,ios,objective-c,sprite-kit,Ios,Objective C,Sprite Kit,我有一个游戏菜单,介绍场景和游戏本身。如果玩家死了,我想再次显示游戏菜单。当游戏开始时,菜单出现。按新游戏显示介绍场景,因为它应该。动画播放一段时间后,会触发self.scenendcallback()并显示游戏场景。当玩家死亡时,gameEndCallback()会因EXC\u BAD\u访问而崩溃 GameViewController.m __weak GameViewController *weakSelf = self; IntroScene *intro

我有一个游戏菜单,介绍场景和游戏本身。如果玩家死了,我想再次显示游戏菜单。当游戏开始时,菜单出现。按新游戏显示介绍场景,因为它应该。动画播放一段时间后,会触发self.scenendcallback()并显示游戏场景。当玩家死亡时,gameEndCallback()会因EXC\u BAD\u访问而崩溃

GameViewController.m

        __weak GameViewController *weakSelf = self;
        IntroScene *introScene = [IntroScene nodeWithFileNamed:@"IntroScene"];
        introScene.scaleMode = SKSceneScaleModeAspectFill;
        [skView presentScene:introScene];
        introScene.sceneEndCallback = ^{
            GameScene *scene = [GameScene nodeWithFileNamed:@"GameScene"];
            scene.scaleMode = SKSceneScaleModeAspectFill;
            SKTransition *transition = [SKTransition fadeWithDuration:2];
            [skView presentScene:scene transition:transition];
            scene.gameEndCallback = ^{
                [weakSelf.navigationController popViewControllerAnimated:YES];
            };

        };
内部游戏场景.h

@property (nonatomic, copy) dispatch_block_t gameEndCallback;

是否有任何东西实际调用了
introScene.scenendcallback
?因为,如果没有该选项,
scene.gameEndCallback
将为空,尝试调用它将因访问错误而崩溃。

1。请提供事故日志。2.在调用之前是否检查
gameEndCallback
是否为
NULL
?这与崩溃没有直接关系,但您也应该重新获取对self的强引用,并在引用它之前检查nil,而不是像现在这样直接引用weakSelf。看@BorisVerebsky你是对的。gameEndCallback为空。但是为什么呢?是的,因为游戏场景是在内部场景之后呈现的。然后确保在正确的实例上调用它。你是什么意思?它在正确的实例上被调用,但不知怎么的gameEndCallback是空的…实际上,我只是在转换到场景之前分配了gameEndCallback。将这两条线路切换到一起使其工作。:)