我有一个和MasterViewController的游戏。它有一个连接到GameViewController的“播放”按钮。除了我在游戏场景的更新方法中添加了一个NSLog,并且在故事板上创建了一个从GameViewController返回到MasterViewController的“退出”按钮之外,游戏的构建提供了简单的“退出”按钮。
一切都按预期运行。我启动应用程序并触摸播放按钮,它就会转换到GameScene上的GameViewController。很好,我看到了标准的"Hello World“消息,可以通过触摸来创建旋转的宇宙飞船。我开始从update方法获取NSLog输出。太棒了。
但是,当我单击Quit按钮并返回到MasterViewController时,我仍然从GameScene update方法获得NSLog输出,因此GameScene仍然是活动的。我想要GameScene消失。向GameScene添加了一个取消分配,但它永远不会被调用,可能是因为ARC。
在GameViewController中,我添加了一个弱gameScene属性,并且:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
NSLog(@"viewWillDisappear");
[_gameScene removeAllChildren];
[_gameScene removeAllActions];
[_gameScene removeFromParent];
_gameScene = nil;
}仍然从GameScene更新方法获得NSLog输出。叹息..。我怎么杀死GameScene死了,死了,死了?
我做了几次播放/退出/播放/退出转换。update方法的输出为:
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在后台仍然是活动的。
发布于 2014-11-21 02:47:13
必须确保没有其他对象强烈指向要从内存中删除的对象。参见Apple Developer。
发布于 2014-11-24 00:47:03
我找到了一个变通的办法--使用导航控制器,我总是把它藏起来,为我的游戏腾出空间。要转换到层次结构中的下一个视图控制器,请使用"Show“段。要弹出,请添加您自己的后退按钮并连接操作:
- (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消失时,所有这些操作都会正确地释放它们。
https://stackoverflow.com/questions/27047022
复制相似问题