在UINavigationController中,当es dealloc调用时?在我的应用程序中,我有4个ViewController:
View1Controller-> View2Controller-> View3Controller-> View4Controller
如果我在View2Controller中并按下Back Button转到View1Controller,则会调用View2Controller中的dealloc。但是如果我在View1Controller中并转到View2Controller,那么dealloc永远不会在View1Controller中调用。
没关系?还是漏了?
感谢。
修改
答案 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,则会取消分配。