gpt4 book ai didi

ios - 重新加载 UIViewController 和 Dealloc

转载 作者:行者123 更新时间:2023-11-29 03:41:54 25 4
gpt4 key购买 nike

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

当单击按钮时,我只是创建一个新的 GameViewController 并推送它。然而,在执行此操作时,旧的 GameViewController 不会释放分配,有时还会干扰新的 viewController(就像在旧 View Controller 上执行增加分数的 block 一样,会增加新 View Controller 上的分数)。

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

所以我想当创建和推送一个新的 View Controller 时,它实际上并不是一个新的,而是旧的。

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

提前致谢

最佳答案

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

您可以在新 Controller 动画完成后通过更改 UINavigationController.viewControllers 直接更新导航堆栈属性(property)。(例如类似

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

但这个解决方案对我来说看起来不太好)

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

关于ios - 重新加载 UIViewController 和 Dealloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18308909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com