【问题标题】:Why bother with releasing memory in viewDidUnload and dealloc为什么要在 viewDidUnload 和 dealloc 中释放内存
【发布时间】:2011-04-05 08:39:17
【问题描述】:

这些方法不是在应用程序即将关闭时调用吗?如果是这样,那内存不会被清空吗?

【问题讨论】:

    标签: iphone cocoa-touch ipod-touch


    【解决方案1】:

    如果您只有一个视图可以持续应用程序的持续时间,那么 unload 和 dealloc 目前甚至都不会被调用,因此这些方法实际上是未使用且不需要的。

    但是,如果您曾经扩展此应用程序以使视图和对象可以切换使用和停止使用,那么在内存不足的情况下,很可能会调用这些方法来降低您的应用程序的内存占用,因此该应用程序不会因为使用太多内存而被杀死。因此,将它们留在(并正确编码以释放内部分配的对象和 malloc 的内存)以供将来的代码重用被认为是一种好的做法。这就是为什么它们带有各种 Cocoa 模板的原因。

    【讨论】:

      【解决方案2】:

      这些方法不是在应用程序即将关闭时调用吗?如果是这样,那内存不会被清空吗?

      viewDidUnloaddealloc 确实在应用程序终止时被调用,但这些肯定不是唯一的时间。正确实现这些清理方法非常重要,还有didReceiveMemoryWarning

      如果您没有正确清理dealloc,那么您的应用将开始泄漏内存。随着时间的推移,它可能会消耗越来越多的内存,直到被系统终止。

      同样,如果您的viewDidUnload 没有释放其资源,则可能是内存泄漏。如果多次使用视图,每次调用都会泄漏。

      在 iOS 4 中,仔细的内存管理比以往任何时候都更加重要,因为如果用户按下 Home 按钮,您的应用程序可能最终会在后台运行。这意味着它可能运行的时间比以往任何时候都长,因此当它重新回到前台时,您将重用相同的视图控制器。如果你的应用没有正确释放未使用的内存,它几乎肯定会被系统杀死。

      【讨论】:

      • 如果应用程序终止,那么所有的内存泄漏都消失了,对吧?
      • 是的,当应用程序终止时,操作系统会释放所有资源。但是依靠这个来为除了一个微不足道的应用程序之外的任何东西进行所有清理是危险的(正如 hotpaw2 所解释的那样)。
      【解决方案3】:

      viewDidUnload 仅在内存不足的情况下调用。您想释放您在 viewDidLoad 中创建的所有对象。你想把它们配对。您仍然希望释放 dealloc 中的所有内容,因为如果您的应用中从未出现低内存情况,则不会调用 viewDidUnload。

      【讨论】:

        【解决方案4】:

        请记住,从 NSObject 继承的每个类都有其 dealloc ,因此当对象的引用计数达到 0 时,将调用它的 dealloc,这意味着该对象拥有的内存最好被释放。

        同样viewDidUnload 是每个 UIViewController 都有的方法,当不再需要与控制器关联的主视图时调用它,如果你愿意,它不再可见(你可以认为它在你弹出时被调用导航堆栈中的控制器或切换选项卡栏控制器中的选项卡)。当视图不显示/未激活/未使用等时,应用程序和 iPhone/iPod 周围不存在视图所拥有的对象很方便。

        最后是 AppDelegate,因为一个对象有自己的 dealloc 方法,所以你的困惑可能来自这一点。

        【讨论】:

        • 你的回答假设我对我不知道的事情感到困惑。它解决了这些问题,并不能很好地回答我的问题。
        • 我的问题简洁明了,即写得很好。我猜英语不是你的母语。
        • 你说得对,英语不是我的母语。 Sill,您似乎无法制定适合您需求的问题,查看我们都给您的答案(几乎相同)并查看您过去的问题
        猜你喜欢
        • 2011-01-22
        • 2011-11-09
        • 1970-01-01
        • 2011-09-20
        • 2010-11-12
        • 2011-03-14
        • 2012-05-04
        • 2011-09-10
        • 2011-07-01
        相关资源
        最近更新 更多