主页按钮按下会导致SpriteKit SKView中的EXC_BAD_ACCESS代码= 1

时间:2013-09-27 18:55:44

标签: ios ios7 exc-bad-access sprite-kit

当您按下主页按钮时,SpriteKit应该清理并暂停所有计时器。

但是,我们发现如果您在显示活动SKView时单击主页按钮,则应用程序崩溃。即使该视图已被用户暂停,也会发生这种情况。

奇怪的是,如果你双击主页按钮并转到多任务处理视图,一切正常。

跟进注意:模拟器在两种情况下都能正常运行,不会崩溃

是否有其他人在使用SpriteKit时遇到此问题?

您找到了原因/解决方案吗?

4 个答案:

答案 0 :(得分:10)

我遇到了同样的问题,我在应用程序移动到后台之前手动暂停ViewController中的根SKView解决了这个问题:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Configure the view (already setup as SKView via storyboard)
    SKView * skView = (SKView *)self.view; 

    // Create and configure the scene.
    SKScene *scene = [Menu sceneWithSize:CGSizeMake(skView.bounds.size.height, skView.bounds.size.width)];
    scene.scaleMode = SKSceneScaleModeAspectFill;

    // Present the scene.
    [skView presentScene:scene];
    [[NSNotificationCenter defaultCenter]
    addObserver:self
    selector:@selector(appWillEnterBackground)
    name:UIApplicationWillResignActiveNotification
    object:NULL];
}

- (void)appWillEnterBackground
{
    SKView *skView = (SKView *)self.view;
    skView.paused = YES;
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [[NSNotificationCenter defaultCenter]
    addObserver:self
    selector:@selector(appWillEnterForeground)
    name:UIApplicationWillEnterForegroundNotification
    object:NULL];
}

- (void)appWillEnterForeground
{
    SKView * skView = (SKView *)self.view;
    skView.paused = NO;
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [[NSNotificationCenter defaultCenter]
    addObserver:self
    selector:@selector(appWillEnterBackground)
    name:UIApplicationWillResignActiveNotification
    object:NULL];
}

答案 1 :(得分:0)

  1. 运行Xcode的分析器(Project> Analyze)以确定代码中是否存在内存管理问题。

  2. 在Instruments应用程序的分配工具(Project> Profile)中运行此方案,该工具可以报告任何检测到的内存滥用情况。

答案 2 :(得分:0)

我们遇到了一些与UICollectionView类似的不一致行为。在这种情况下,通过Storyboard实例化对象(而不是以编程方式)解决了问题。

预感到今天早上我和Viola一起尝试了,成功了!

所以,看起来Storyboard在创作时对我们不了解并且允许它们在Home Button按下时正确终止。令人沮丧,但至少它现在有效。

答案 3 :(得分:0)

问题可能是由音频引起的,如果是这样,你可以在这里查看答案https://stackoverflow.com/a/19283721/1278463

我在一个不使用音频的游戏中解决了这个问题。解决方案是在输入背景时暂停SKView:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    SKView *view = (SKView *)self.window.rootViewController.view;
    if (view) {
        view.paused = YES;
    }
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    SKView *view = (SKView *)self.window.rootViewController.view;
    if (view) {
        view.paused = NO;
    }
}