【问题标题】:Where to release an object? dealloc or ViewDidUNload在哪里释放一个对象? dealloc 或 ViewDidUNload
【发布时间】:2011-03-14 06:49:58
【问题描述】:

当我们需要释放一个对象时,在哪里做呢,是在 dealloc 方法中还是在 viewController 的 ViewDidUnload 中?哪个更好?

我认为 viewDidUnload 会做得更好,因为一旦视图控制器被卸载,对象就会被释放。在 dealloc 的情况下,来自documentation

当应用程序终止时, 对象可能不会被发送一个 dealloc 信息。因为进程的内存 退出时自动清除,它 更有效的只是让 操作系统清理资源 而不是调用所有的内存 管理方法。

应用程序退出时,可能不会向对象发送 dealloc 消息。

所以我发现如果对象提前释放会比推迟释放更好,从而减少应用程序占用的内存。

如果我的理解有误,请指正。

感谢和问候, 克里希南

【问题讨论】:

    标签: iphone memory memory-management


    【解决方案1】:

    您必须从 iOS 6 开始考虑这一点

    viewDidUnload

    从不调用,来自 Apple:

    在 iOS 6 之前,当出现内存不足警告时, 如果 UIViewController 类知道它可以重新加载或 稍后重新创建它们。如果发生这种情况,它还会调用 viewWillUnload 和 viewDidUnload 方法让你的代码有机会 放弃与您的视图关联的任何对象的所有权 层次结构,包括从 nib 文件加载的对象、创建的对象 在您的 viewDidLoad 方法中,以及在运行时延迟创建的对象和 添加到视图层次结构中。在 iOS 6 上,视图永远不会被清除并且 这些方法永远不会被调用。如果您的视图控制器需要 当内存不足时执行特定任务,它应该覆盖 didReceiveMemoryWarning 方法。

    【讨论】:

      【解决方案2】:

      是的,你的理解是错误的。

      首先,应用程序退出时发生什么并不重要,因为操作系统会释放应用程序分配的所有内存。在应用程序终止时不调用 dealloc 只是 Apple 加快此过程的一种方式。

      其次,调用viewDidUnload时卸载的不是视图控制器,而是它的视图。视图控制器在被释放之前一直保持活动状态。

      viewDidUnload 中,您必须释放那些属于视图的对象以及所有可以并且将在viewDidLoad 中重新创建的对象(因为当视图控制器需要重新创建其视图时,viewDidLoad 将被再次调用)。这包括您的所有网点。您还必须将这些变量设置为 nil 以避免过度释放它们。

      因为在dealloc 中,您应该释放视图控制器保留的所有对象,包括您包含在viewDidUnload 中的对象。

      查看 Apple 的任何示例代码,了解 Apple 是如何做到这一点的。

      【讨论】:

      • 您好 Ole,感谢您的回复。现在我明白了,我应该在 ViewDidUnload 中发布我在 ViewDidLoad 中创建的内容。我的一个疑问是,我是否应该在 -dealloc 方法中释放我已经在 -ViewDidUnload 方法中发布的东西。因为当我的 -dealloc 被调用时,视图应该被移除并且 -viewDidUnload 必须被调用。所以我想这将是代码的重复。请分享你的想法。谢谢问候,克里希南。
      • Apple 在其所有示例代码中都有这种重复的发布模式,因此我建议您按照他们的示例进行操作。从文档中并不完全清楚 viewDidUnload 是否总是在 dealloc 之前被调用。重要的是还要在viewDidUnload 中将变量设置为nil,以避免过度释放对象。
      • 这可能会增加一点——根据经验 viewDidUnload 很少被调用。实际上,只有当应用程序遇到内存不足的情况时才会调用它,来自 viewDidUnload 上的苹果文档。如果你想确保你已经释放了内存,那么 dealloc 就是这样做的地方。重复无关紧要——您可以毫无问题地将消息(如发布)发送到 nil。但请确保您将变量清零,否则您可能会将消息发送到随机的内存块!
      猜你喜欢
      • 2011-01-22
      • 2011-11-18
      • 2011-11-09
      • 2010-11-12
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      相关资源
      最近更新 更多