在内存压力下会调用dealloc
吗?如果是真的,是在didReceiveMemoryWarning
之前还是在之后调用?此外,当视图控制器被释放时,是否可以调用dealloc
?
答案 0 :(得分:3)
没有关系,didReceiveMemoryWarning让你有机会通过删除任何不需要的资源来对低内存情况做出反应。
如果视图控制器或任何其他对象被释放并且其保留计数减少到0,那么它将被删除并且将调用其dealloc。
如果一个对象被释放但其保留计数没有减少到0那么它就不会被删除,因此它的dealloc不会被调用。
当删除对象时,调用dealloc,删除和释放不是同一个东西。当保留计数达到0时,将删除该对象。
答案 1 :(得分:3)
didReceiveMemoryWarning
只是告诉你内存不足。视图和控制器都没有被释放。另一方面,在iOS 6之前,您可能会同时收到viewDidUnload
,这会通知您视图已被删除(但不是视图控制器)。这就是你覆盖didReceiveMemoryWarning
的原因,所以你也可以释放你的视图控制器可以安全释放的任何其他东西。但是这些低内存情况下,视图控制器永远不会被释放。最糟糕的情况是,如果调用viewDidUnload
,视图将被释放,但不会被控制器释放。
仅供参考,我引述文件:
内存是iOS中的关键资源,视图控制器提供 内置支持,可在关键时刻减少内存占用 倍。
UIViewController
类提供了一些自动处理 低内存条件通过didReceiveMemoryWarning
方法, 这会释放不需要的内存。发生内存不足警告时,
UIViewController
类将清除 它的视图是否知道它可以在以后重新加载或重新创建它们。如果 发生这种情况,[如果运行6.0之前的iOS版本]它也会调用viewWillUnload
和viewDidUnload
让代码有机会放弃任何所有权的方法 与视图层次结构关联的对象,包括 从nib文件加载的对象,在viewDidLoad
中创建的对象 方法,以及在运行时延迟创建并添加到视图中的对象 层次结构。
和
当系统确定数量时,将调用[
didReceiveMemoryWarning
] 可用内存很低。此方法的默认实现 尝试释放视图控制器的视图[在6.0之前的iOS版本中]。要被释放, 视图必须没有超视图;也就是说,它不是视图的一部分 层次结构。有关如何卸载视图的详细信息,请参阅“The View Controller Life Cycle”。您可以覆盖此方法以释放所使用的任何其他内存 你的视图控制器。如果你这样做,你实现这个方法 必须在某个时刻调用超级实现以允许视图 控制器释放其视图。如果您的视图控制器成立 对视图层次结构中的视图的引用,您应该释放它们 改为使用
viewDidUnload
方法中的引用。
<强>更新强>
回答你的另一个问题(你现在可能不在乎你意识到视图控制器本身在调用didReceiveMemoryWarning
时被释放),是的,当项目最终被释放时(和保留计数为零,即alloc和所有各种保留现在由相应的发布语句抵消),然后将调用dealloc
。