2011-04-13 101 views
4

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

现在我的应用程序有一个NavigationController,它具有设置为根视图控制器的MainMenuViewController(自定义视图控制器)。在应用程序生命周期中,新的ViewController在导航控制器上按下/弹出。这工作正常,第一次将它们推入堆栈时,会启动相应的ViewController(来自NIB)。

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

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

  1. 这是一个正确的方式来卸载一个弹出的ViewController?
  2. 如何检查给定的ViewController是否加载?
  3. 如何强制重新加载?用loadWithNib:,然后推入导航堆栈?

问候,

彼得

回答

3

欢迎的iOS编程。你的崩溃是一个内存管理问题。这可能需要你一点得到了它的窍门,但存储管理变得比较容易的方式,如果你只是遵循一个规则:

对象需要释放任何它保留(ALLOC相当于保留)

在这种情况下,你的视图控制器正在释放它本身,它绝对不会保留它自己。这里的序列如何与导航控制器:

  1. 导航控制器与根视图控制器(其堆栈中的第一个)初始化。让我们打电话给这个firstViewController

  2. 用户操作告诉firstViewController初始化secondViewController并将其推到导航控制器上。在大多数情况下,firstViewController将在推送后释放secondViewController的实例。在这一点上,firstVC完成与​​。导航控制器正在保留​​

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

  4. 现在用户又回到firstVC。他们可以执行相同的用户操作,该操作将启动并推送​​的新实例。

希望能有所帮助。

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

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

+0

感谢对你的答案,但你给出的例子是我的情况太简单了 - 我要决定哪些viewcontrollers到的dealloc,当(有时,甚至当它被弹出,我希望它保存它的状态,所以当用户返回时,它会立即引起)。现在我已经解决了这个问题,并设置了MainView控制器作为通知中心的观察者 - 而其他视图控制器发布通知,如果他们想要被解除分配或从堆栈中弹出。 – 2011-04-15 05:00:29

+0

我真的不知道你在做什么,但我仍然会推荐阅读和理解文档。根据需要开始简单并增加复杂性,事情正在发挥作用。祝你好运。 – XJones 2011-04-15 06:16:00

相关问题