2013-03-21 125 views
1

我的初始视图控制器使用performSegue:withIdentifier方法,其反过来使用同一performSegue:withIdentifier方法加载一些其它控制器中的另一个视图控制器。故事板控制器不解除分配故事板负载

但是,初始视图控制器和第二个视图控制器都不释放。他们都倾向于通过工具看到的参考计数为1。

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

但是,对我而言,以前的控制器将不会被释放。因此,导致再创造相同的视图控制器。

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

回答

4

当您执行推式或模态时,它不会(也不应该)释放您正在寻找的视图控制器。它需要保持它,以便当你弹出/解散它时,它仍然会在那里。此规则的例外情况是使用拆分视图控制器并使用替换segue时。但这是一个特例。

如果您想回到第一个场景,如果您使用的是导航控制器并且只使用push segues,则可以使用popToRootViewControllerAnimated。 (对于iOS 5的目标,我会一直使用导航控制器,并且如果我不想让导航栏看到它,就会隐藏导航栏。出于这个原因,可以很方便地弹出多个层次,实现相同的效果非常麻烦)在iOS 6中,您可以使用unwind segue,您可以在其中弹出/关闭任意数量的场景,例如返回到您的初始场景。

0

在iOS 6之前A UIViewController将保持活着状态,但其更为昂贵的UIView将被释放以节省内存。与UIView相比,UIViewController本身非常轻。 由于iOS 6中,你应该根据文档覆盖didReceiveMemoryWarning

Google文档UIViewController

内存管理

内存是iOS中的关键资源,视图控制器提供 内置支持减少他们的内存足迹在关键 次。 UIViewController类通过它的didReceiveMemoryWarning方法提供了一些 低内存条件的自动处理, 释放了不需要的内存。

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

只要你管理你正确的反应(取决于iOS版本)和dealloc视图,我看到这里没有问题。

2

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

如果你必须回到你的VC层次,您应该使用UINavigationController与推动/坡平风险投资,或呈现/解雇模态VC。您可以通过模态地呈现UINavigationController来组合这两者。

+0

+1同意。至少有两个例外:首先,在iOS 6中,您可以执行一个展开顺序的“performSegue”。其次,如果使用分割视图控制器的替换segue,它同样没有关系。但是你绝对正确,你永远不需要一套循环推/模态的赛段。 – Rob 2013-03-21 14:52:32

+0

感谢您确认我的想法。虽然你的答案更完整,所以+1。我以前没有听说过放松,而且看起来很不错。快速回答你链接到的答案:在第3步中,你说“在视图控制器A的.m中实现动作”,它不应该是B而不是A吗? – rdurand 2013-03-21 15:12:53

+0

不可以,不可以。您可以在视图控制器中定义放松动作,以便放松(否则,如果您有一打以前的场景,它将如何知道哪一个?)。 IB确定所有先前的场景及其相关的视图控制器,扫描.m文件进行放松操作,抓取这些名称,并在最后一个场景中列出那些您尝试添加放松继续。顺便说一下,这也是为什么我喜欢给我放松行为有意义的名字,以便当你使用它们时,你可以清楚地知道你正在展开的场景。 – Rob 2013-03-21 15:18:44