【发布时间】:2011-09-06 11:02:45
【问题描述】:
还有谁能告诉我 viewDidUnload 和 dealloc 有什么区别?
【问题讨论】:
标签: iphone ios memory-management uinavigationcontroller
还有谁能告诉我 viewDidUnload 和 dealloc 有什么区别?
【问题讨论】:
标签: iphone ios memory-management uinavigationcontroller
是的,如果出现内存警告,它可以被卸载。
关于 viewDidUnload 和 dealloc 之间的区别——前者是在你的视图被卸载时调用的,通常是因为内存不足的情况。后者在您的对象的保留计数达到零时调用(即它完全从内存中释放)
【讨论】:
UIViewControllers 永远不会被卸载。他们拥有的UIViews 可以。
因此,如果您的问题是 UIView 是否可以卸载,尽管它的控制器已被推送到导航控制器,答案是肯定的。只有当前显示的 UIView 不会被卸载(如果你不阻止卸载机制工作)。
此外,viewDidUnload 是当 UIViewController 管理的视图已卸载时发送给 UIViewController 的消息,这通常与释放视图不同。事实上,当视图真正被释放时,它肯定会被卸载,但不会发送viewDidUnload。
【讨论】:
已推送到导航控制器堆栈且尚未弹出的 UIViewController 不会被释放。但是,它的view 属性可能会被卸载——特别是,如果发生内存不足的情况并且该视图控制器的视图当前不可见(某些东西正在覆盖它,例如模式对话框,或者另一个 VC 被推到顶部它),视图可能会被系统卸载。
viewDidUnload 对于该方法的作用来说是个坏名字。当内存不足导致视图被卸载时调用它 - 即它不是 viewDidLoad 的“相反”方法,我认为您可能会合理地期望。
更多信息:
When should I release objects in -(void)viewDidUnload rather than in -dealloc?
【讨论】:
同样重要的是viewDidLoad 将在viewDidUnload 之后再次调用。如果您在viewDidLoad 中执行设置,则应以第二次调用不会导致内存泄漏的方式处理它。
要么删除viewDidUnload 中的所有内容(礼貌,如果它们是内存密集型的),或者在设置它们时检查它们的存在并且不要重复两次。 (当然,在 dealloc 方法之前或期间完全拆除它们。)
您不保证viewDidUnload 将在dealloc 之前被调用。
【讨论】: