在哪里发布对象? dealloc或ViewDidUNload

时间:2010-07-10 15:32:31

标签: iphone memory memory-management

当我们需要释放一个对象时,无论是在dealloc方法还是在ViewDidUnload中为viewController发布?哪个更好?

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

  

当应用程序终止时,   对象可能无法发送dealloc   信息。因为这个过程的记忆   它会在退出时自动清除   简单地允许更有效率   操作系统来清理资源   而不是调用所有的记忆   管理方法。

在退出应用程序时,可能无法向对象发送dealloc消息。

所以我发现如果对象早先发布会比推迟发布更好,从而减少应用程序占用的内存空间。

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

谢谢和问候, 克里希南

2 个答案:

答案 0 :(得分:6)

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

首先,当应用程序退出时会发生什么并不重要,因为操作系统将释放应用程序分配的所有内存。不要在应用程序终止时调用dealloc只是Apple提高速度的方法。

其次,调用viewDidUnload但仅调用其视图时,不会删除视图 controller 。视图控制器保持活动状态,直到它被解除分配。

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

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

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

答案 1 :(得分:1)

您必须考虑来自iOS 6

  

viewDidUnload

从Apple开始,

永远不会被召唤:

  

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