故事板的我的初始视图控制器使用performSegue:withIdentifier
方法加载另一个视图控制器,后者又使用相同的performSegue:withIdentifier
方法加载其他控制器。
但是,初始视图控制器和第二视图控制器都没有解除分配。通过仪器可以看出它们的参考数都是1。
我需要在用户退出应用程序时将用户发送回第一个控制器。我到目前为止唯一的方法是使用performSegue:withIdentifier
方法并将用户发送回初始控制器。
但是,我担心以前的控制器不会被解除分配,导致重新创建相同的视图控制器。
由于我需要将用户注销回第一个屏幕,因此我想确保已取消分配所有以前的视图控制器。
答案 0 :(得分:4)
执行推送或模态segue时,它不会(也不应该)释放您正在查看的视图控制器。它需要保持它,以便当您弹出/关闭它时,它仍然会存在。此规则的例外是使用拆分视图控制器并使用替换segue时。但这是一个特例。
如果要返回第一个场景,如果您使用的是导航控制器并且仅使用推送段,则可以使用popToRootViewControllerAnimated
。 (对于iOS 5目标,我将始终使用导航控制器,并且如果我不希望它可见则隐藏导航栏。因此。能够弹回多个级别很方便。实现相同效果很麻烦使用模态segues。)在iOS 6中,您可以使用unwind segue,您可以在其中弹出/取消任意数量级别的场景,例如,返回到您的初始场景。
答案 1 :(得分:2)
使用performSegue
循环不是一个好主意..
如果您必须返回VC层次结构,则应该使用UINavigationController
来推送/弹出VC,或者使用/解除模式VC。您可以通过模态呈现UINavigationController
来结合使用。
答案 2 :(得分:0)
在iOS 6之前,UIViewController
将保持活跃状态但更昂贵的UIView
将被释放以节省内存。与UIViewController
相比,UIView
本身相当轻松。
从iOS 6开始,您应该根据文档覆盖didReceiveMemoryWarning
UIViewController的文档:
内存管理
内存是iOS中的关键资源,视图控制器提供 内置支持,可在关键时刻减少内存占用 倍。 UIViewController类提供了一些自动处理 低内存条件通过didReceiveMemoryWarning方法, 这会释放不需要的内存。
在iOS 6之前,当发生低内存警告时, UIViewController类如果知道它可以重新加载或清除它的视图 之后再次重新创建它们。如果发生这种情况,它也会调用 viewWillUnload和viewDidUnload方法为您的代码提供机会 放弃与您的视图关联的任何对象的所有权 层次结构,包括从nib文件加载的对象,创建的对象 在您的viewDidLoad方法中,以及在运行时懒惰地创建的对象 添加到视图层次结构中。在iOS 6上,视图永远不会被清除 永远不会调用这些方法。如果您的视图控制器需要 当内存不足时执行特定任务,它应该覆盖 didReceiveMemoryWarning方法。
只要您管理正确反应(取决于iOS版本)并取消视图,我认为这里没有问题。