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

sta*_*ext 13 iphone memory-leaks memory-management uiviewcontroller uinavigationcontroller

我希望在我推出一个视图控制器后,我需要释放我对视图控制器的所有权,就像我在下面所做的那样.

CustomViewController *nextViewController = [[CustomViewController alloc] initWithNibName:@"CustomView" bundle:nil];
[[self navigationController] pushViewController:nextViewController animated:YES];
[nextViewController release];
Run Code Online (Sandbox Code Playgroud)

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

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

Ste*_*ntz 14

"导航控制器是否只是在保留该对象,以防它在某些时候需要它?"

对.这正是它正在做的事情.它会发送给你viewDidLoadviewDidUnload消息.这是您应该分配和释放viewcontroller使用的资源的地方.

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

如果您需要更直接的控制何时加载和释放的东西,那么一个更好的地方可能是viewWillAppear:viewDidDisappear:.

我对viewcontrollers的alloc/init方法通常很空或者甚至没有.

  • 根据文档,viewDidUnload仅在您的设备进入低内存条件时发送.没有任何迹象表明viewDidUnload与释放有关. (2认同)
  • 啊,我终于明白了这笔交易是什么.我有一组模型对象,它们将视图控制器作为其委托.发生的事情是我设置@property保留的那些模型对象.对不起,如果这有点混乱,但谢谢你的每一个时间. (2认同)