1

我的情节提要的初始视图控制器使用performSegue:withIdentifier方法加载另一个视图控制器,该方法又使用相同的performSegue:withIdentifier方法加载其他一些控制器。

但是,初始视图控制器和第二个视图控制器都没有释放。正如通过仪器看到的那样,它们都倾向于具有 1 的参考计数。

当他退出应用程序时,我需要将用户发送回第一个控制器。到目前为止,我想到的唯一方法是使用performSegue:withIdentifier方法并将用户发送回初始控制器。

但是,我担心以前的控制器不会因此被释放,导致重新创建相同的视图控制器。

由于我需要将用户注销回到第一个屏幕,因此我想确保所有以前的视图控制器都已被释放。

4

3 回答 3

4

当您执行推送或模态转场时,它不会(也不应该)释放您正在转场的视图控制器。它需要保留它,以便当您弹出/关闭它时,它仍然存在。此规则的例外是在使用拆分视图控制器并且您使用替换转场时。但那是个特例。

如果你想回到第一个场景,如果你使用导航控制器并且只使用 push segues,你可以使用popToRootViewControllerAnimated. (对于 iOS 5 的目标,我会一直使用导航控制器,如果我不希望它可见就隐藏导航栏,因为这个原因。能够弹出多个级别很方便。实现相同的效果很麻烦带有模态转场。)在 iOS 6 中,您可以使用unwind segue,您可以在其中弹出/关闭任意数量的场景级别,例如,返回到初始场景。

于 2013-03-21T14:40:35.397 回答
3

循环performSegue不是一个好主意..

如果您必须返回您的 VC 层次结构,您应该使用UINavigationController带有推送/弹出 VC 的 a,或者呈现/关闭模态 VC。您可以通过模态呈现一个UINavigationController.

于 2013-03-21T11:04:03.533 回答
0

在 iOS 6 之前,AUIViewController将保持活动状态,但其更昂贵的UIView将被释放以节省内存。与 a 相比,UIViewController它本身很轻UIView。从 iOS 6 开始,您应该根据文档覆盖didReceiveMemoryWarning

UIViewController的文档:

内存管理

内存是 iOS 中的关键资源,视图控制器提供内置支持以减少关键时刻的内存占用。UIViewController 类通过其 didReceiveMemoryWarning 方法提供了一些低内存条件的自动处理,该方法释放不需要的内存。

在 iOS 6 之前,当发生内存不足警告时,如果 UIViewController 类知道以后可以重新加载或重新创建它们,则它会清除其视图。如果发生这种情况,它还会调用 viewWillUnload 和 viewDidUnload 方法,让您的代码有机会放弃与视图层次结构关联的任何对象的所有权,包括从 nib 文件加载的对象、在 viewDidLoad 方法中创建的对象以及创建的对象在运行时懒惰地添加到视图层次结构中。在 iOS 6 上,视图永远不会被清除,并且这些方法永远不会被调用。如果您的视图控制器需要在内存不足时执行特定任务,它应该覆盖 didReceiveMemoryWarning 方法。

只要您管理正确,就可以做出正确的反应(取决于 iOS 版本)并解除分配视图,我认为这里没有问题。

于 2013-03-21T10:56:38.213 回答