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
的文档:
父 vc 是我的初始 vc 吗?呈现视图控制器负责关闭视图 它呈现的控制器。如果您在呈现的视图上调用此方法 控制器本身,UIKit 要求呈现视图控制器处理 解雇。
你的结构有点复杂。通常,当一个 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?