ViewController 分配和释放问题

Posted

技术标签:

【中文标题】ViewController 分配和释放问题【英文标题】:ViewController allocation and deallocation problems 【发布时间】:2015-09-30 08:23:51 【问题描述】:

我的应用程序中的 ViewController 之间有这 2 个“循环”。

第一个循环是游戏循环。首先 VC 显示我的级别。第二个 VC 是我的游戏画面,如果游戏结束,我的第三个 VC 会出现,并带有积分、星星等。

第二个“Loop”只是三个VC用刷卡。

好的,现在问题出在哪里?我对释放有疑问。比如加班我刷,我的位置在síinstruments上升,曲线越来越高......

也是我的游戏循环。我之前无法释放vc。

我想我没有正确理解 [self dismissViewControllerAnimated:NO completion:nil];有效。

对不对,这个方法总是发送给父vc,而父vc释放我执行这个方法的vc?

父vc是我最初的vc吗?

如何在我的“循环”中正确解除和解除分配视图控制器?

现在,我在工具中的分配曲线在每个级别都越来越高,大约 18-21 级我的应用程序崩溃了,我认为是因为分配过多。

谁能告诉我,我可以解决我的问题吗?

【问题讨论】:

你创建了ARC项目还是非arc? 哦,抱歉,arc 已启用,我忘记了。 仍有问题面临或解决? 【参考方案1】:

从您的问题开始:

是不是一直把这个方法发给父vc,而父vc解除分配我执行这个方法的那个vc?

来自关于dismissViewControllerAnimated:completion的文档:

呈现视图控制器负责关闭视图 它呈现的控制器。如果您在呈现的视图上调用此方法 控制器本身,UIKit 要求呈现视图控制器处理 解雇。

父 vc 是我的初始 vc 吗?

你的结构有点复杂。通常,当一个 VC(我们称之为 X)呈现另一个 VC(这个是 Y)时,X 将是 Y 的父级。但是您必须共享其他代码,例如如何分配这些 VC,如何/何时重新呈现它们等,以了解哪一个是“最”父母。

当你在 X 上调用 [self presentViewController:Y animated:** completion:** 时;

X 将是presentingViewController

Y 将是presentedViewController

因此,X 是 Y 的负责人。Parent :) 所以,你的问题对你的计划有点无效。但是,您可以轻松地说,您最初的 VC 可能是他提出的所有 VC 的父级。 (例如,如果您为 VC 嵌入导航控制器,它将是根 VC,它将负责“缠绕/展开”,使其成为“父级”。)

通常,视图控制器不应在它们之间循环。它们可以相互依赖,但不应产生循环。

解决方案建议:

在我看来,每次关卡开始时,您都在复制这 3 种 VC。这是第一个循环的问题。第二个循环有点复杂,我假设你想在滑动到其他 VC 时保存 VC 的状态。

1.操纵当前的 VC。

这些 VC 必须有一个选项来清除他的状态,一切都应该像第一次加载一样被重置。您将只创建这些 VC一次,并在需要时重置它们。

2.创建一个单例类来保存这些 VC。

(注意:由于此解决方案涉及将 VC 放在一个类中,它们将始终占用内存。不过,它们不会被绘制到窗口。)

当您启动应用程序时,将创建一个单例,同时您还将创建所需的 VC。这个类应该有这样的方法:

addViewControllerToStack:
showViewController:animated:completion:
resetViewController:

当然还有持有这些 VC 的属性。

3.通过单例控制

当用户按下“转到 X 级别”之类的按钮时,您必须与您创建的 Singleton 类进行交互。如果您要解雇 VC,单身人士应该这样做。也用于演示。

总结:

使用此方法,您不能创建多个相同类型的 VC。您始终可以使用由 Singleton 类创建的那个,并且您始终可以重用它们。但要小心,因为你没有释放任何 VC,你最终可能会留下残留物(比如忘记重置/删除计时器、重置分数等)。

我在我的一个项目中使用过它,该项目需要一个带有 OpenGL 的视图控制器。我不能忽略它,因为它总是在做计算。而且它只能被创建一次。不好的部分是,它正处于 VC segues 的中间。所以,每当我需要展示那个 VC 时,我都会调用我的 Singleton 类来展示它。我只创建一次。

【讨论】:

以上是关于ViewController 分配和释放问题的主要内容,如果未能解决你的问题,请参考以下文章

在GameScene和ViewController Swift之间移动

添加到 NavigationController 时如何释放 ViewController 对象?

UINavigationController:弹出时释放 ViewController 的内存

如果从navigationController弹出时会释放ViewController?

ViewController respondsToSelector:]: 消息发送到释放的实例

分配和释放 VS。自动释放。为啥和何时?