执行autorelease方法的对象什么时候被释放。
2014-10-13 21:09
155 查看
OS的运行时是由一个一个runloop组成的,每个runloop都会执行下图的一些步骤:
可以看到,每个runloop中都创建一个Autorelease Pool,并在runloop的末尾进行释放,所以,一般情况下,每个接受autorelease消息的对象,都会在下个runloop开始前被释放。也就是说,在一段同步的代码中执行过程中,生成的对象接受autorelease消息后,一般是不会在代码段执行完成前释放的。
当然也有让autorelease提前生效的办法:自己创建Pool并进行释放
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSArray * array = [[[NSArray alloc] init] autorelease];
[pool drain];
上面的array就会在[pool drain]执行时被释放。
所以对于你遇到的问题,可以在for循环外嵌套一个Autorelease Pool进行管理,例如
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
for (int i = 0; i < 10000; i++)
{
// ...
}
[pool drain];
但由于你提到了生成的每个实例可能会比较大。只在循环外嵌套,可能导致在pool释放前,内存里已经有10000个实例存在,造成瞬间占用内存过大的情况。
因此,如果你的每个实例仅需要在单次循环过程中用到,那么可以考虑可以在循环内创建pool并释放
for (int i = 0; i < 10000; i++)
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// ...
[pool drain];
}
相关文章推荐
- autorelease对象具体什么时候释放?
- autorelease对象具体什么时候释放?
- JAVA中对象什么时候死亡以及什么时候执行finalize()方法
- autorelease对象什么时候释放?
- autorelease对象具体什么时候释放?
- autorelease对象具体什么时候释放
- Objective-C的自动释放池(autoreleasepool)、静态方法快速创建对象
- 浅谈iphone开发中关于第三方对象执行回调的方法
- 通过反射访问对象的私有变量和执行私有方法
- ASP中建立Excel对象,Excel进程总是无法释放(看了网上的很多帖子,两种方法,但是都不是很好)
- 使用表达式树,让访问者直接执行“角色”对象的方法
- 关于多态性的动态绑定问题, 对象调用方法的执行过程.
- js的执行对象限制某种方法执行的解决方案
- C#下Socket对象的BeginReceive方法,执行后竟然不调用AsyncCallback里的回调函数
- python类中显示重写__del__方法引起循环引用的对象无法释放,一种循环引用的检测方法
- java对象方法执行顺序规律
- DirectX 3D中某些对象的释放需要手动调用Dispose方法
- 通过写finalize()来执行自定义的对象释放行为
- 微软bug解决方法:System.ObjectDisposedException: 无法访问已释放的对象。对象名:“Icon”
- smarty模板文件中执行php代码 调用php函数的方法 使用对象等