Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何杀掉一场恶作剧_Ios_Objective C - Fatal编程技术网

Ios 如何杀掉一场恶作剧

Ios 如何杀掉一场恶作剧,ios,objective-c,Ios,Objective C,我有一个MasterViewController游戏。它有一个“播放”按钮,可以连接到GameViewController。GameViewController和GameSecene是游戏构建提供的普通功能,除了我在游戏场景的更新方法中添加了一个NSLog,并且在故事板上创建了一个“退出”按钮,该按钮从GameViewController返回到MasterViewController - (IBAction)pauseButtonClicked:(UIButton *)sender { N

我有一个MasterViewController游戏。它有一个“播放”按钮,可以连接到GameViewController。GameViewController和GameSecene是游戏构建提供的普通功能,除了我在游戏场景的更新方法中添加了一个NSLog,并且在故事板上创建了一个“退出”按钮,该按钮从GameViewController返回到MasterViewController

- (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];
}
一切正常。我启动应用程序并点击Play按钮,它会切换到GameViewController和游戏场景。很好,我看到了标准的“Hello World”信息,可以触摸来创建旋转的宇宙飞船。我开始从update方法获取NSLog输出。太好了

但是,当我单击退出按钮并返回MasterViewController时,我仍然从GameSecene更新方法获得NSLog输出,因此GameSecene仍然处于活动状态。我想让游戏场景消失。在游戏场景中添加了一个dealloc,但它从未被调用,可能是因为ARC

在GameViewController中,我添加了一个弱游戏场景属性,并:

- (void)viewWillDisappear:(BOOL)animated {
   [super viewWillDisappear:animated];
   NSLog(@"viewWillDisappear");
   [_gameScene removeAllChildren];
   [_gameScene removeAllActions];
   [_gameScene removeFromParent];
   _gameScene = nil;
}
仍然从GameSecene更新方法获取NSLog输出。叹气我该如何杀死游戏场景?死了,死了,死了

我做了几次播放/退出/播放/退出转换。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

所以我所有的游戏场景在背景中都是活跃的

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

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

- (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和GameSecene消失时,所有这些都会正确地解除分配它们。

您的segue和GameViewController创建工作如何?在某个地方是否有一个块正在捕获GameViewController并将其挂起?GameViewController是否以某种方式捕获了自己?使用故事板,我在MasterViewController上放置了一个Play按钮,在GameViewController上放置了一个Quit按钮,并将每个按钮之间的控件拖动到另一个控制器以设置分段。纯香草的东西。我创建这个演示项目只是为了探索这一点,没有做任何特殊的事情。问题是我在视图控制器之间的分段是模态的吗?我把它们改成了一段一段的,没什么区别。