UIViewController目前在UINavigationContoller的viewController堆栈中是否会被卸载?

时间:2011-06-01 16:18:52

标签: iphone ios memory-management uinavigationcontroller

也有人会告诉我viewDidUnload和dealloc之间的区别是什么?

5 个答案:

答案 0 :(得分:1)

在低内存条件下,当视图控制器需要释放其视图以及与该视图关联的任何对象以释放内存时,

viewDidUnload:被调用。 More

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

永远不会卸载

UIViewController。他们拥有的UIView可以是。

所以,如果你质疑是否可以卸载UIView,尽管它的控制器已被推送到导航控制器,答案是肯定的。只有当前显示的UIView不会被卸载(如果你不阻止卸载机制工作)。

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

答案 3 :(得分:0)

已被推送到导航控制器堆栈但尚未弹出的UIViewController将不会被释放。但是,它的view属性可能会被卸载 - 特别是,如果出现内存不足的情况并且该视图控制器的视图当前不可见(某些内容覆盖它,如模式对话框或其他VC推送在它之上),视图可以由系统卸载。

viewDidUnload是该方法的错误名称。当低内存条件导致视图被卸载时调用它 - 即它不是viewDidLoad的'相反'方法,我认为你可能会合理地预期。

更多信息:

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

答案 4 :(得分:0)

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

要么在viewDidUnload中撕下所有内容(礼貌,如果它们是内存密集的话),或者在设置它们时检查它们是否存在并且不要进行两次。 (当然,在dealloc方法之前或期间完全撕掉它们。)

保证在viewDidUnload之前调用dealloc