【问题标题】:Would a UIViewController currently in UINavigationContoller's viewController stack be unloaded?当前在 UINavigationContoller 的 viewController 堆栈中的 UIViewController 会被卸载吗?
【发布时间】:2011-09-06 11:02:45
【问题描述】:

还有谁能告诉我 viewDidUnload 和 dealloc 有什么区别?

【问题讨论】:

    标签: iphone ios memory-management uinavigationcontroller


    【解决方案1】:

    viewDidUnload : 在内存不足的情况下调用,当视图控制器需要释放其视图以及与该视图关联的任何对象以释放内存时。 More

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

    【讨论】:

    • 在 viewDidUnload 被调用时,视图已经被卸载——这已经为你完成了。仍然取决于您的 UIViewController 子类来酌情释放您管理的任何插座。
    • @occulus : 请阅读苹果文档 viewDidUnload 。
    【解决方案2】:

    是的,如果出现内存警告,它可以被卸载。

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

    【讨论】:

      【解决方案3】:

      UIViewControllers 永远不会被卸载。他们拥有的UIViews 可以。

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

      此外,viewDidUnload 是当 UIViewController 管理的视图已卸载时发送给 UIViewController 的消息,这通常与释放视图不同。事实上,当视图真正被释放时,它肯定会被卸载,但不会发送viewDidUnload

      【讨论】:

        【解决方案4】:

        已推送到导航控制器堆栈且尚未弹出的 UIViewController 不会被释放。但是,它的view 属性可能会被卸载——特别是,如果发生内存不足的情况并且该视图控制器的视图当前不可见(某些东西正在覆盖它,例如模式对话框,或者另一个 VC 被推到顶部它),视图可能会被系统卸载。

        viewDidUnload 对于该方法的作用来说是个坏名字。当内存不足导致视图被卸载时调用它 - 即它不是 viewDidLoad 的“相反”方法,我认为您可能会合理地期望。

        更多信息:

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

        【讨论】:

          【解决方案5】:

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

          要么删除viewDidUnload 中的所有内容(礼貌,如果它们是内存密集型的),或者在设置它们时检查它们的存在并且不要重复两次。 (当然,在 dealloc 方法之前或期间完全拆除它们。)

          保证viewDidUnload 将在dealloc 之前被调用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-02-27
            • 1970-01-01
            • 2011-11-15
            • 2014-08-05
            • 2020-10-31
            • 2014-02-04
            • 1970-01-01
            • 2018-12-21
            相关资源
            最近更新 更多