【发布时间】:2011-04-05 08:39:17
【问题描述】:
这些方法不是在应用程序即将关闭时调用吗?如果是这样,那内存不会被清空吗?
【问题讨论】:
标签: iphone cocoa-touch ipod-touch
这些方法不是在应用程序即将关闭时调用吗?如果是这样,那内存不会被清空吗?
【问题讨论】:
标签: iphone cocoa-touch ipod-touch
如果您只有一个视图可以持续应用程序的持续时间,那么 unload 和 dealloc 目前甚至都不会被调用,因此这些方法实际上是未使用且不需要的。
但是,如果您曾经扩展此应用程序以使视图和对象可以切换使用和停止使用,那么在内存不足的情况下,很可能会调用这些方法来降低您的应用程序的内存占用,因此该应用程序不会因为使用太多内存而被杀死。因此,将它们留在(并正确编码以释放内部分配的对象和 malloc 的内存)以供将来的代码重用被认为是一种好的做法。这就是为什么它们带有各种 Cocoa 模板的原因。
【讨论】:
这些方法不是在应用程序即将关闭时调用吗?如果是这样,那内存不会被清空吗?
viewDidUnload 和 dealloc 确实在应用程序终止时被调用,但这些肯定不是唯一的时间。正确实现这些清理方法非常重要,还有didReceiveMemoryWarning。
如果您没有正确清理dealloc,那么您的应用将开始泄漏内存。随着时间的推移,它可能会消耗越来越多的内存,直到被系统终止。
同样,如果您的viewDidUnload 没有释放其资源,则可能是内存泄漏。如果多次使用视图,每次调用都会泄漏。
在 iOS 4 中,仔细的内存管理比以往任何时候都更加重要,因为如果用户按下 Home 按钮,您的应用程序可能最终会在后台运行。这意味着它可能运行的时间比以往任何时候都长,因此当它重新回到前台时,您将重用相同的视图控制器。如果你的应用没有正确释放未使用的内存,它几乎肯定会被系统杀死。
【讨论】:
viewDidUnload 仅在内存不足的情况下调用。您想释放您在 viewDidLoad 中创建的所有对象。你想把它们配对。您仍然希望释放 dealloc 中的所有内容,因为如果您的应用中从未出现低内存情况,则不会调用 viewDidUnload。
【讨论】:
请记住,从 NSObject 继承的每个类都有其 dealloc ,因此当对象的引用计数达到 0 时,将调用它的 dealloc,这意味着该对象拥有的内存最好被释放。
同样viewDidUnload 是每个 UIViewController 都有的方法,当不再需要与控制器关联的主视图时调用它,如果你愿意,它不再可见(你可以认为它在你弹出时被调用导航堆栈中的控制器或切换选项卡栏控制器中的选项卡)。当视图不显示/未激活/未使用等时,应用程序和 iPhone/iPod 周围不存在视图所拥有的对象很方便。
最后是 AppDelegate,因为一个对象有自己的 dealloc 方法,所以你的困惑可能来自这一点。
【讨论】: