当前在UINavigationContoller的viewController堆栈中的UIViewController会被卸载吗?

问题描述:

也有人会告诉我viewDidUnload和dealloc之间有什么区别?当前在UINavigationContoller的viewController堆栈中的UIViewController会被卸载吗?

是的,如果发生内存警告,它可能会被卸载。

至于viewDidUnload和dealloc之间的区别 - 当您的视图被卸载时,前者会被调用,通常是因为内存不足。当对象的保留计数达到零时(即,它完全从内存释放),调用后者。

UIViewController s永远不会被卸载。他们拥有的UIView可以。

所以,如果你的问题是如果一个UIView可以卸载,虽然它的控制器已经被推到导航控制器上,答案是肯定的。只有当前显示的UIView不会被卸载(如果你不阻止卸载机制的工作)。

此外,viewDidUnload是一个消息,当它所管理的视图已被卸载时,该消息被发送到UIViewController,这通常与释放视图不同。实际上,当视图实际上被释放时,它肯定会被卸载,但不会发送viewDidUnload

已被压入导航控制器堆栈但尚未弹出的UIViewController不会被解除分配。但是,它的view属性可能会被卸载 - 特别是,如果出现内存不足的情况,并且该视图控制器的视图当前不可见(有些内容正在覆盖它,如模式对话框或其他VC上的视图) ),该视图可能会被系统卸载。

viewDidUnload对于该方法的用途而言是一个糟糕的名称。当低内存条件导致视图被卸载时它被调用 - 即它不是与viewDidLoad“相反”的方法,我想你可能会合理地期望这种方法。

更多信息:

When should I release objects in -(void)viewDidUnload rather than in -dealloc?

viewDidUnload:在低内存条件时调用视图控制器需要释放其视图与视图以释放内存相关联的任何对象。 More

dealloc:取消分配接收方占用的内存,通过释放NSObject协议方法间接调用对象的dealloc方法。 More

+0

在pointDidUnload被调用的时候,视图已经被卸载 - 这是为你完成的。它仍然取决于您的UIViewController的子类,以便根据需要发布您管理的任何网点。 – occulus 2011-06-01 16:31:31

+0

@occulus:plz阅读viewDidUnload的apple文档。 – Jhaliya 2011-06-01 16:34:12

同样重要的是viewDidLoad将在viewDidUnload之后再次被调用。如果您在viewDidLoad中执行设置,则应该以第二次调用它不会导致内存泄漏的方式处理它。

要么在viewDidUnload(礼貌,如果它们是内存密集型)中撕下所有东西,或者在设置它们时检查它们的存在并且不要这样做两次。 (而且,当然,完全之前或dealloc方法中撕裂下来。)

您是保证之前deallocviewDidUnload将被调用。