我有一个使用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都在后台仍然活跃。
答案 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消失时,所有这些都正确地解除了释放。