1

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

View1Controller->View2Controller->View3Controller->View4Controller

如果我在 View2Controller 中并按下返回按钮以转到 View1Controller,则调用 View2Controller 中的 dealloc。但是,如果我在 View1Controller 中并转到 View2Controller,则不会在 View1Controller 中调用 dealloc。

没事吧?或者它的泄漏?

谢谢。

编辑

4

4 回答 4

4

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

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

于 2012-05-16T18:51:18.703 回答
1

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

于 2012-10-10T13:28:01.413 回答
1

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

于 2012-05-16T19:04:07.757 回答
0

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

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

编辑2:

要记住的一件事是,当您将某些内容推送到导航堆栈时,其保留计数将增加 1。如果您从导航堆栈中弹出某些内容,其保留计数将减少 1。作为一般规则,当对象的保留计数达到 0,将被释放。

push时,您从中推送的项目(现在在您刚刚推送的下方)没有更改其保留计数。它仍然被导航控制器保留,因此不会被释放,而是消失。弹出时,弹出项的保留计数确实会下降,如果变为 0,它将被释放。

于 2012-05-16T18:45:10.720 回答