Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 什么';didReceiveMemoryWarning和dealloc之间的关系是什么?_Ios_Dealloc_Didreceivememorywarning - Fatal编程技术网

Ios 什么';didReceiveMemoryWarning和dealloc之间的关系是什么?

Ios 什么';didReceiveMemoryWarning和dealloc之间的关系是什么?,ios,dealloc,didreceivememorywarning,Ios,Dealloc,Didreceivememorywarning,在内存压力下是否会调用dealloc?如果是真的,它是在direceivememorywarning之前还是之后调用的?另外,当释放视图控制器时,是否确定将调用dealloc 没有关系,didReceiveMemoryWarning让您有机会通过删除任何不需要的资源来应对内存不足的情况 如果视图控制器或任何其他对象被释放,并且其保留计数减少到0,则将删除它并调用其dealloc 如果对象已释放,但其保留计数未减少到0,则不会删除该对象,因此不会调用其dealloc 删除对象时调用dealloc,

在内存压力下是否会调用
dealloc
?如果是真的,它是在
direceivememorywarning
之前还是之后调用的?另外,当释放视图控制器时,是否确定将调用
dealloc

没有关系,didReceiveMemoryWarning让您有机会通过删除任何不需要的资源来应对内存不足的情况

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

如果对象已释放,但其保留计数未减少到0,则不会删除该对象,因此不会调用其dealloc


删除对象时调用dealloc,删除和释放不是一回事。对象的保留计数达到0时将被删除。

didReceiveMemoryWarning只是通知您内存不足。视图和控制器均未释放。另一方面,在iOS 6之前,您可能会同时收到
viewDidUnload
,通知您视图已被删除(但视图控制器未被删除)。这就是为什么要覆盖
direceivememorywarning
,以便您还可以释放视图控制器可以安全释放的任何其他内容。但是在这些内存不足的情况下,视图控制器永远不会释放。最坏的情况是,如果调用了
viewDidUnload
,将释放视图,但不会释放控制器

仅供参考,我引用文件:

内存是iOS中的关键资源,视图控制器提供 内置支持在关键时刻减少内存占用 时代。UIViewController类提供了对 通过其
didReceiveMemoryWarning
方法,内存不足, 释放不需要的内存

当出现内存不足警告时,
UIViewController
class清除 它的视图,如果它知道可以重新加载或重新创建它们。如果 这种情况会发生,[如果运行6.0之前的iOS版本],它还会调用
viewWillUnload
viewDidUnload
方法,使您的代码有机会放弃任何 与视图层次结构关联的对象,包括 从nib文件加载的对象,在
viewdiload中创建的对象
方法,以及在运行时延迟创建并添加到视图中的对象
等级制度

当系统确定 可用内存不足。此方法的默认实现 尝试释放视图控制器的视图[在6.0之前的iOS版本中]。即将发布的 视图不能有超级视图;也就是说,它不是视图的一部分 等级制度有关如何卸载视图的详细信息,请参见

您可以重写此方法以释放所使用的任何其他内存 您的视图控制器。如果您这样做了,那么您的实现就是这个方法 必须在某个时候调用超级实现以允许视图 控制器释放其视图。如果视图控制器保持不变 对视图层次结构中视图的引用,应释放这些引用 改为使用
viewDidUnload
方法中的引用

更新:


在回答您的另一个问题时(您可能不关心,因为您已经意识到,当调用
didReceiveMemoryWarning
时,视图控制器本身并没有被释放),是的,当项目最终被释放时(并且保留计数为零,即alloc和所有各种保留现在由相应的发布声明抵消),然后将调用
dealoc

顺便说一句,模拟器还可以让您模拟内存警告事件,这样您就可以准确地看到它的作用。只需在各种视图控制器方法(例如viewDidLoad、viewDidUnload、Dealoc、didReceiveMemoryWarning等)中放入NSLog语句或类似语句即可,您将确切地看到它在做什么。