当我们需要释放一个对象时,无论是在dealloc方法还是在ViewDidUnload中为viewController发布?哪个更好?
我认为viewDidUnload会做得更好,因为一旦视图控制器被卸载,对象就会被释放。在dealloc案例中,来自documentation
当应用程序终止时, 对象可能无法发送dealloc 信息。因为这个过程的记忆 它会在退出时自动清除 简单地允许更有效率 操作系统来清理资源 而不是调用所有的记忆 管理方法。
在退出应用程序时,可能无法向对象发送dealloc消息。
所以我发现如果对象早先发布会比推迟发布更好,从而减少应用程序占用的内存空间。
如果我的理解有误,请纠正我。
谢谢和问候, 克里希南
答案 0 :(得分:6)
是的,你的理解是错误的。
首先,当应用程序退出时会发生什么并不重要,因为操作系统将释放应用程序分配的所有内存。不要在应用程序终止时调用dealloc只是Apple提高速度的方法。
其次,调用viewDidUnload
但仅调用其视图时,不会删除视图 controller 。视图控制器保持活动状态,直到它被解除分配。
在viewDidUnload
中,您必须释放属于视图的对象以及可以在viewDidLoad
中重新创建的所有内容(因为viewDidLoad
会在视图中再次调用控制器需要重新创建其视图)。这包括您的所有商店。您还必须将这些变量设置为nil
,以避免过度释放它们。
因为在dealloc
中,您应该释放视图控制器保留的所有对象,包括viewDidUnload
中包含的对象。
查看Apple的任何示例代码,了解Apple如何做到这一点。
答案 1 :(得分:1)
您必须考虑来自iOS 6
从Apple开始,viewDidUnload
永远不会被召唤:
在iOS 6之前,当发生低内存警告时, UIViewController类如果知道它可以重新加载或清除它的视图 之后再次重新创建它们。如果发生这种情况,它也会调用 viewWillUnload和viewDidUnload方法为您的代码提供机会 放弃与您的视图关联的任何对象的所有权 层次结构,包括从nib文件加载的对象,创建的对象 在您的viewDidLoad方法中,以及在运行时懒惰地创建的对象 添加到视图层次结构中。在iOS 6上,视图永远不会被清除 永远不会调用这些方法。如果您的视图控制器需要 当内存不足时执行特定任务,它应该覆盖 didReceiveMemoryWarning方法。