在NavigationController中Dealloc

时间:2012-05-16 18:41:44

标签: iphone uinavigationcontroller dealloc

在UINavigationController中,当es dealloc调用时?在我的应用程序中,我有4个ViewController:

View1Controller-> View2Controller-> View3Controller-> View4Controller

如果我在View2Controller中并按下Back Button转到View1Controller,则会调用View2Controller中的dealloc。但是如果我在View1Controller中并转到View2Controller,那么dealloc永远不会在View1Controller中调用。

没关系?还是漏了?

感谢。

修改

4 个答案:

答案 0 :(得分:4)

在UINavigationViewController堆栈上推送和弹出视图控制器就像一般意义上的堆栈一样。如果你有一个包含数字的堆栈,按2,那么36会给你一堆2个数字,你不会指望2消失。推送视图控制器完全相同,当您按下ViewController2时,您不会期望ViewController1消失。

然而,弹出它是不同的。如果你弹出36,你不会指望36仍然存在。与视图控制器相同。弹出ViewController2,当用户界面显示ViewController1视图时,它将被释放。

答案 1 :(得分:1)

这也与保留计数有关。如果你弹出一个视图控制器并且你没有以任何其他方式引用它,那么引用计数将变为零,并且iOS可能很快就会解除它。如果你以某种方式引用它,例如拥有一个拥有类的成员,并且当它从导航堆栈中弹出时引用计数没有被归零,那么它就不会在那时被释放。

答案 2 :(得分:1)

在视图控制器中检查NSTimer。如果存在NSTimer,则在控制器的viewWillDisappear或viewDidDisappear中使其无效。

答案 3 :(得分:0)

将视图控制器推送到导航堆栈不会卸载/解除您来自的视图控制器。它仍然存在于新的下面的堆栈中。如果没有在其他任何地方保留(使用强指针),从视图控制器弹出将取消分配它。

编辑: 为什么View4Controller会以任何方式对View2Controller中发生的事情做出反应?从您描述它的方式来看,它根本不应该在导航堆栈上。

<强> EDIT2:

要记住的一件事是,当您将某些内容推送到导航堆栈时,其保留计数将增加1.如果您从导航堆栈中弹出某些内容,其保留计数将下降1.作为一般规则,当一个对象的保留计数达到0时,它将被解除分配。

推送时,您正在推送的项目(现在位于您刚刚推送的项目下方)没有更改其保留计数。它仍然被导航控制器保留,因此不会被解除分配,而是消失。当弹出时,弹出项目的保留计数会下降,如果变为0,则会取消分配。