重新加载UIViewController和Dealloc

时间:2013-08-19 07:56:14

标签: ios objective-c

我有一个回合制游戏,允许用户同时玩多个比赛。转弯后,用户可以点击“转到下一场比赛”按钮。

单击按钮时,我只需创建一个新的GameViewController,并将其推送。但是,在执行此操作时,旧的GameViewControlller将不会释放,并且有时会使用新的viewController进行干扰(类似于执行增加oldView控制器上的分数的块,会增加新分数)。

我想推送一个新的viewController而不是nuke并清理旧的,并重用它的原因是因为我想要推送动画,出于安全考虑,我想要一个干净的动画。

所以我想在创建和推送一个新的viewcontroller时,它不是一个新的,而是旧的。

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle: nil];
            GameViewController *gameViewController = (GameViewController *)[mainStoryboard instantiateViewControllerWithIdentifier: @"GameViewController"];
            gameViewController.matchObject = match;
            [weakSelf.navigationController pushViewController:gameViewController animated:YES];

提前致谢

2 个答案:

答案 0 :(得分:1)

您推送GameViewController的新实例,但您的旧控制器不会被销毁,因为它存储在导航控制器的堆栈中。存在潜在的内存泄漏 - 如果您为每个回合推动新控制器并且从不弹出它。

通过更改UINavigationController.viewControllers属性,您可以在新控制器动画完成后直接更新导航堆栈。 (例如

// I assume you using ARC.
NSMutableArray *temp = [NSMutableArray array];
[temp addObjectsFromArray:self.navigationController.viewControllers]
[temp removeObjectAtIndex:temp.count - 2];
self.navigationController.viewControllers = [temp copy];

但是这个解决方案对我来说看起来并不好看。

您可以在没有导航控制器的情况下使用漂亮的推送转换,请查看CATransition类。

答案 1 :(得分:0)

如果你只是推一个新的视图控制器,你的旧视图控制器仍然会在那里。它只是不可见,因为新的一个在顶部。你可以尝试这样的事情(假设你还没有在其他地方删除你的旧视图控制器):

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle: nil];
GameViewController *gameViewController = (GameViewController *)[mainStoryboard instantiateViewControllerWithIdentifier: @"GameViewController"];
gameViewController.matchObject = match;
[weakSelf.navigationController popViewControllerAnimated:NO];
[weakSelf.navigationController pushViewController:gameViewController animated:YES];