didReceiveMemoryWarning和dealloc之间有什么关系?

时间:2012-06-06 00:45:25

标签: ios dealloc didreceivememorywarning

在内存压力下会调用dealloc吗?如果是真的,是在didReceiveMemoryWarning之前还是在之后调用?此外,当视图控制器被释放时,是否可以调用dealloc

2 个答案:

答案 0 :(得分:3)

没有关系,didReceiveMemoryWarning让你有机会通过删除任何不需要的资源来对低内存情况做出反应。

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

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

当删除对象时,调用dealloc,删除和释放不是同一个东西。当保留计数达到0时,将删除该对象。

答案 1 :(得分:3)

didReceiveMemoryWarning只是告诉你内存不足。视图和控制器都没有被释放。另一方面,在iOS 6之前,您可能会同时收到viewDidUnload,这会通知您视图已被删除(但不是视图控制器)。这就是你覆盖didReceiveMemoryWarning的原因,所以你也可以释放你的视图控制器可以安全释放的任何其他东西。但是这些低内存情况下,视图控制器永远不会被释放。最糟糕的情况是,如果调用viewDidUnload,视图将被释放,但不会被控制器释放。

仅供参考,我引述文件:

  

内存是iOS中的关键资源,视图控制器提供   内置支持,可在关键时刻减少内存占用   倍。 UIViewController类提供了一些自动处理   低内存条件通过didReceiveMemoryWarning方法,   这会释放不需要的内存。

     

发生内存不足警告时,UIViewController类将清除   它的视图是否知道它可以在以后重新加载或重新创建它们。如果   发生这种情况,[如果运行6.0之前的iOS版本]它也会调用viewWillUnloadviewDidUnload   让代码有机会放弃任何所有权的方法   与视图层次结构关联的对象,包括   从nib文件加载的对象,在viewDidLoad中创建的对象   方法,以及在运行时延迟创建并添加到视图中的对象   层次结构。

  当系统确定数量时,将调用

[didReceiveMemoryWarning]   可用内存很低。此方法的默认实现   尝试释放视图控制器的视图[在6.0之前的iOS版本中]。要被释放,   视图必须没有超视图;也就是说,它不是视图的一部分   层次结构。有关如何卸载视图的详细信息,请参阅“The View Controller Life Cycle”

     

您可以覆盖此方法以释放所使用的任何其他内存   你的视图控制器。如果你这样做,你实现这个方法   必须在某个时刻调用超级实现以允许视图   控制器释放其视图。如果您的视图控制器成立   对视图层次结构中的视图的引用,您应该释放它们   改为使用viewDidUnload方法中的引用。

<强>更新

回答你的另一个问题(你现在可能不在乎你意识到视图控制器本身在调用didReceiveMemoryWarning时被释放),是的,当项目最终被释放时(和保留计数为零,即alloc和所有各种保留现在由相应的发布语句抵消),然后将调用dealloc