Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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
Ios5 自动释放和保留的使用_Ios5_Memory Management_Retain_Autorelease_Nsautoreleasepool - Fatal编程技术网

Ios5 自动释放和保留的使用

Ios5 自动释放和保留的使用,ios5,memory-management,retain,autorelease,nsautoreleasepool,Ios5,Memory Management,Retain,Autorelease,Nsautoreleasepool,我有一个简单的问题。当保留计数较高时,自动释放是否工作 例如。。。如果我在视图控制器中,请执行以下操作: [self retain]; [self retain]; [self retain]; [self retain]; [self autorelease]; 如果我弹出视图,它会被释放吗 谢谢。自动释放只需将对象添加到自动释放池中。释放自动释放池时,将向该对象以及该池中的所有其他对象发送一条释放消息。如果retain count仍然大于零,并且没有进一步的释放,那么将出现内存泄漏 我相信

我有一个简单的问题。当保留计数较高时,自动释放是否工作

例如。。。如果我在视图控制器中,请执行以下操作:

[self retain];
[self retain];
[self retain];
[self retain];
[self autorelease];
如果我弹出视图,它会被释放吗


谢谢。

自动释放只需将对象添加到自动释放池中。释放自动释放池时,将向该对象以及该池中的所有其他对象发送一条释放消息。如果retain count仍然大于零,并且没有进一步的释放,那么将出现内存泄漏

我相信,如果你按照上面所说的做,你将有5个保留计数(一个来自alloc,4个来自上面的4个保留)。您已将该对象添加到自动释放队列,以便稍后它将接收释放并将保留计数减少1。最后,弹出视图应该会将其再减少一个。这将导致保留计数为3。所以我认为你会有内存泄漏

但是,如果您使用的是iOS5,最新的编译器使用ARC(自动引用计数),您不必担心这个问题。大部分情况下是这样的

已编辑:从自动释放池向对象发送释放时更正。见:
抱歉提供了错误的信息。

自动释放只是“延迟释放”;它要求在稍后的某个未指定的时间调用释放。因此,它将只平衡一个保留。在任何情况下,自动释放不是一个神奇的方法,将删除您的对象,无论发生什么;保留计数必须平衡。或者更好:对象所有权必须明确并相应地进行管理。这不是“经过一段时间”。当有人在自动释放池上调用
drain
release
时,通常是在调用堆栈的某个位置调用创建它的同一个函数。文档会说(或至少过去会说)类似于“稍后某个时间”的内容。对于默认池,我相信它位于运行循环的每个“周期”的末尾。在任何情况下,添加的对象应该至少在当前方法/函数返回之前一直存在。因此,基本上它是一个“延迟释放”,除非您有一个自定义池,并立即将其耗尽,我想。@ranreload我记得自动释放的对象只存在很短的时间。它的目的是给你足够的时间用它做点什么,然后它就消失了。您始终可以创建另一个自动释放池,并且可以在需要时随时将其中的任何一个池排空。但我似乎再也找不到文档中及时删除对象的地方了。所以我想我要么记错了,要么自动释放系统的工作原理不同。你是对的。“短时间”有多短,显然取决于具体情况。我相信,拥有所有权并在完成后释放它是明智的做法。