UINavigationController:推送的视图何时收到 Dealloc 消息?

Posted

技术标签:

【中文标题】UINavigationController:推送的视图何时收到 Dealloc 消息?【英文标题】:UINavigationController: When Does a Pushed View Receive the Dealloc Message? 【发布时间】:2011-01-13 16:41:27 【问题描述】:

我希望在推送视图控制器之后,我需要像下面那样释放我对视图控制器的所有权。

CustomViewController *nextViewController = [[CustomViewController alloc] initWithNibName:@"CustomView" bundle:nil];
[[self navigationController] pushViewController:nextViewController animated:YES];
[nextViewController release];

在我这样做之后,我假设导航控制器拥有该对象的所有权,并在完成后释放它,然后在我的 customViewController 上调用 dealloc。我希望当我点击导航栏上的后退按钮并且不再显示视图时会发生这种情况。但这不会发生。我在 CustomViewController 的 dealloc 方法中添加了一个 NSLog(@"CustomViewController did receive dealloc") 但它从未被打印出来。这是正常行为吗?

导航控制器是否只是在做一些事情,比如保留该对象以备不时之需?当内存开始耗尽时它会摆脱它吗?我尝试模拟低内存警告,但没有任何反应。我感觉这个问题的答案是我不应该太担心,并遵循保留/释放/自动释放的标准程序。话虽如此,还有其他人对此进行了深入研究并找到了绝对答案吗?

【问题讨论】:

【参考方案1】:

“导航控制器是否只是在做一些事情,比如保留该对象以备不时之需?”

是的。这正是它正在做的事情。它会向您发送viewDidLoadviewDidUnload 消息。这就是您应该分配和释放视图控制器使用的资源的地方。

请注意,viewDidUnload 只会在系统认为需要释放内存时调用。

如果您需要更直接地控制何时加载和释放内容,那么更好的位置可能是viewWillAppear:viewDidDisappear:

我的视图控制器的 alloc/init 方法通常很空,甚至根本不存在。

【讨论】:

根据文档,viewDidUnload 仅在您的设备进入低内存条件的情况下发送。没有任何迹象表明 viewDidUnload 与解除分配有关。 这会带来更多? 1) 我的 viewconroller 中的 dealloc 方法是什么? 2)导航控制器是否只是等到它得到某种信号才能最终摆脱旧的视图控制器? 3)如果#2是,那么什么信号?我在我的视图控制器类中将 nslog 消息放入我的确实收到内存警告方法中,在推送和弹出几次然后模拟内存警告后,我在控制台上收到 N 条消息。这告诉我所有对象仍然存在,并且内存警告并没有导致它们被释放,因为 dealloc 消息中的日志消息没有打印出来。 对不起,错字,我是想说。如果其他方法将用于释放资源,我的视图控制器中的 dealloc 方法的目的是什么? 啊,我终于弄清楚了交易是什么。我有一组以视图控制器为代表的模型对象。发生的事情是在我设置 @property 保留的那些模型对象中。抱歉,如果这有点令人困惑,但感谢大家的宝贵时间。ios 6 开始,viewDidUnload 已被弃用。

以上是关于UINavigationController:推送的视图何时收到 Dealloc 消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 UINavigationController 从左侧推送?

UINavigationController 不会推送其他视图控制器?

UINavigationController:推送的视图何时收到 Dealloc 消息?

使用 UINavigationController 推送两个视图后后退按钮消失

UINavigationController 停止推送视图

UINavigationController 没有推送/显示视图