如何杀死SKScene

时间:2014-11-20 18:36:06

标签: ios objective-c

我有一个使用MasterViewController的游戏。它有一个" Play"分段到GameViewController的按钮。 GameViewController和GameScene是游戏构建提供的普通游戏,除了我在GameScene的更新方法中添加了一个NSLog,并在故事板上创建了一个" Quit"从GameViewController向MasterViewController分段的按钮。

一切都按预期工作。我启动应用程序并触摸播放按钮,然后它转换到GameViewController到GameScene。好吧,我看到标准" Hello World"消息,可以触摸创建旋转宇宙飞船。我开始从update方法获取NSLog输出。大。

但是,当我单击Quit按钮并将其切换回MasterViewController时,我仍然从GameScene更新方法获取NSLog输出,因此GameScene仍处于活动状态。我希望GameScene不见了。在GameScene中添加了一个dealloc,它永远不会被调用,可能是因为ARC。

在GameViewController中,我添加了一个弱的gameScene属性,并且:

- (void)viewWillDisappear:(BOOL)animated {
   [super viewWillDisappear:animated];
   NSLog(@"viewWillDisappear");
   [_gameScene removeAllChildren];
   [_gameScene removeAllActions];
   [_gameScene removeFromParent];
   _gameScene = nil;
}

仍然从GameScene更新方法获取NSLog输出。叹息......我怎么杀死GameScene死了,死了,死了?

我多次进行了播放/退出/播放/退出转换。更新方法的输出是:

2014-11-20 12:48:41.551 Demo[7386:2004098] update: 0x7b091090
2014-11-20 12:48:42.095 Demo[7386:2004098] update: 0x7ed21020
2014-11-20 12:48:42.656 Demo[7386:2004098] update: 0x7eb1c4b0
2014-11-20 12:48:43.217 Demo[7386:2004098] update: 0x7b091090
2014-11-20 12:48:43.762 Demo[7386:2004098] update: 0x7ed21020
2014-11-20 12:48:44.322 Demo[7386:2004098] update: 0x7eb1c4b0

所以我的所有GameScenes都在后台仍然活跃。

2 个答案:

答案 0 :(得分:0)

您必须确保没有其他对象强烈指向要从内存中删除的对象。请参阅Apple Developer

答案 1 :(得分:0)

我找到了一个解决方法 - 使用导航控制器,我总是隐藏起来为我的游戏腾出空间。要转换到层次结构中的下一个视图控制器,请使用“显示”segue。要弹回,请添加您自己的后退按钮并连接操作:

- (IBAction)backButtonClicked:(UIButton *)sender {
   [[self navigationController] popViewControllerAnimated:YES];
}

我在GameViewController中也有一个位置,我使用“暂停”按钮一直弹回到根视图控制器。

- (IBAction)pauseButtonClicked:(UIButton *)sender {
   NSArray * viewControllers = self.navigationController.viewControllers;
   NSLog(@"nav view controllers: %@", viewControllers);
   UIViewController * targetViewController = viewControllers[0];
   NSLog(@"target controller: %@", targetViewController);
   [self.navigationController popToViewController:targetViewController animated:YES];
}

当GameViewController和GameScene消失时,所有这些都正确地解除了释放。