为什么要在viewDidUnload和dealloc中释放内存

时间:2010-08-29 06:35:22

标签: iphone cocoa-touch ipod-touch

当应用程序即将关闭时,是否调用了这些方法?如果是这样,那么记忆是否都不会全部被清除?

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

  

当应用程序即将关闭时,是否调用了这些方法?如果是这样,那么记忆是否都不会全部被清除?

确实,当应用终止时会调用viewDidUnloaddealloc,但这些肯定不是唯一的次数。正确实现这些清理方法以及didReceiveMemoryWarning

非常重要

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:-2)

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

类似地viewDidUnload是每个UIViewController都有的方法,当不再需要与控制器关联的主视图时调用它,如果你想要的话就不再可见了(你可以想到它在你被调用时) a从导航堆栈弹出控制器或切换tabbar控制器中的选项卡。当视图未显示/活动/使用等时,应用程序和iPhone / iPod不方便拥有视图所拥有的对象。

最后,AppDelegate作为一个对象有自己的dealloc方法,所以也许你的混淆可能来自这一点。