2012-06-06 24 views
3

当内存压力下会调用dealloc吗?如果是这样,是否在didReceiveMemoryWarning之前或之后调用?另外,当视图控制器被释放时,是否可以调用deallocdidReceiveMemoryWarning和dealloc之间的关系是什么?

+0

顺便说一句,模拟器让我们模拟一个内存警告事件,所以你可以看到它的确切功能。只要在你的各种视图控制器方法(例如viewDidLoad,viewDidUnload,dealloc,didReceiveMemoryWarning等)中放置NSLog语句等,你就会明白它在做什么。 – Rob

回答

3

didReceiveMemoryWarning只是通知您内存不足。视图和控制器都不被释放。另一方面,在iOS 6之前,您可能同时收到viewDidUnload,这会通知您视图已被删除(但不是视图控制器)。这就是为什么你重写didReceiveMemoryWarning,所以你也可以释放视图控制器可以安全释放的任何其他东西。但是这些内存不足的情况下,视图控制器从未被释放。最坏的情况下,如果调用viewDidUnload,视图将被释放,但不是控制器。

仅供参考,我从文档报价:

内存是iOS中的关键资源,视图控制器提供 内置在关键 次降低其内存占用的支持。所述UIViewController类通过其didReceiveMemoryWarning方法, ,其释放不需要的存储器提供的 低内存条件的一些自动搬运。

当发生低内存警告时,如果它知道它可以重新加载或稍后再次重新创建,则它将清除其视图 。如果 发生这种情况,[如果之前6.0上运行的IOS版本]它又称viewWillUnloadviewDidUnload 方法给你的代码有机会放弃与您的视图层次结构相关的任何 对象的所有权,包括从加载 对象笔尖文件,在你的viewDidLoad 方法创建的对象,并在运行时懒洋洋地创建并添加到视图 层次结构对象。

[didReceiveMemoryWarning]当系统确定的 可用存储器的量低时被调用。此方法 的默认实现尝试释放视图控制器的视图[在6.0之前的iOS版本中]。要发布, 视图不能有超级视图;也就是说,它不是视图层次结构的组成部分。有关视图如何卸载的更多信息,请参阅“The View Controller Life Cycle”

您可以重写此方法以释放您的视图控制器使用的任何额外内存。如果这样做,那么执行此方法的方法 必须在某个时间调用超级实现以允许控制器发布其视图。如果您的视图控制器对视图层次结构中的视图持有 引用,则应改为在viewDidUnload方法中释放这些 引用。

更新:

在回答您的其他问题(你可以不关心,现在你意识到视图控制器都没有,自己在调用didReceiveMemoryWarning发布的时候),是时,该项目最终被释放(并且保留计数为零,即,该分配和所有各种保留现在被相应的发布声明抵消),则将调用dealloc

3

没有关系,didReceiveMemoryWarning是给你删除任何未所需的资源到内存不足情况作出反应的机会。

如果视图控制器,或任何其他对象,被释放并且它的保留计数减小到0,那么它会被删除,其的dealloc将被调用。

如果一个对象被释放,但其保留计数不减少为0,那么就不会被删除因而它的dealloc不会被调用。

当一个对象被删除一个的dealloc被调用,删除和发布是不一样的东西。当其保留计数达到0时删除一个对象。

相关问题