正确的卸载/重新加载View Controller的方法

时间:2011-04-13 13:07:31

标签: ios uiviewcontroller uinavigationcontroller

我是iOS新手,想知道如何正确实现视图控制器卸载/重新加载。

现在我的应用程序有一个NavigationController,其MainMenuViewController(自定义视图控制器)设置为根视图控制器。在应用程序生命周期的过程中,新的ViewControllers将在导航控制器上推送/弹出。这很好用,第一次将它们推送到堆栈时,会启动相应的ViewControllers(来自NIB)。

但是,我现在想要在弹出时卸载一个特定的ViewController,然后在再次推送时自动重新加载它。

我已经向ViewControllers [self release]添加了viewDidDisappear:并卸载了,但是当我尝试再次推送视图时,我收到一条消息,发送到dealloc'ed实例错误并崩溃。因此,我的问题是:

  1. 这是卸载弹出的ViewController的正确方法吗?
  2. 如何检查是否加载了给定的ViewController?
  3. 如何强行重装?使用loadWithNib:,然后推送到导航堆栈?
  4. 此致

    彼得

1 个答案:

答案 0 :(得分:3)

欢迎使用iOS编程。您的崩溃是一个内存管理问题。可能需要一些时间来掌握它,但如果您只遵循一条规则,内存管理会变得更容易:

对象需要释放它保留的任何内容(alloc等同于保留)

在这种情况下,您的视图控制器正在释放它,它肯定没有保留自己。以下是序列如何与导航控制器一起使用:

  1. 使用根视图控制器(其堆栈中的第一个)初始化导航控制器。让我们称之为firstViewController

  2. 用户操作告诉firstViewController初始化secondViewController并将其推送到导航控制器。在大多数情况下,firstViewController会在推送secondViewController之后释放它。此时,firstVC已完成secondVC。导航控制器现在保留secondVC

  3. 用户触摸secondVC导航栏上的后退按钮。导航控制器将从堆栈弹出secondVC并释放它。只要没有其他对象保留它,secondVC就会被释放。

  4. 现在用户又回到了firstVC。他们可以执行相同的用户操作,该操作将初始化并推送secondVC的新实例。

  5. 希望有所帮助。

    我还建议您(重新)阅读Apple文档并查看框架文档中引用的示例代码。

    http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html