故障板控制器不能解除分配

时间:2013-03-21 10:51:18

标签: iphone ios objective-c ios5 storyboard

故事板的我的初始视图控制器使用performSegue:withIdentifier方法加载另一个视图控制器,后者又使用相同的performSegue:withIdentifier方法加载其他控制器。

但是,初始视图控制器和第二视图控制器都没有解除分配。通过仪器可以看出它们的参考数都是1。

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

但是,我担心以前的控制器不会被解除分配,导致重新创建相同的视图控制器。

由于我需要将用户注销回第一个屏幕,因此我想确保已取消分配所有以前的视图控制器。

3 个答案:

答案 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版本)并取消视图,我认为这里没有问题。