NSAutoreleasePool与autorelease 详解(一)
来源:互联网 发布:mac装好windows没wifi 编辑:程序博客网 时间:2024/06/07 22:38
iOS的运行时,由一个一个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];}
0 0
- NSAutoreleasePool与autorelease 详解(一)
- NSAutoreleasePool与autorelease 详解(二)
- NSAutoreleasePool 发送autorelease消息
- iOS内存管理篇(二)---NSAutoreleasePool/@autoreleasepool/autorelease理解与管理
- 如果autorelease NSAutoreleasePool对象会发生什么?
- autorelease详解
- NSAutoreleasePool与内存管理
- Objective-C内存管理教程和原理剖析(一)(autorelease与release)
- Objective-C内存管理教程和原理剖析(一)(autorelease与release)
- Objective-C内存管理教程和原理剖析(一)(autorelease与release)
- NSAutoreleasepool
- NSAutoreleasePool
- NSAutoReleasePool
- NSAutoReleasePool
- NSAutoreleasePool
- NSAutoreleasePool
- NSAutoReleasePool
- NSAutoreleasePool
- SAP连接数据库
- stack link
- Codility上的练习(12)
- 关于开源框架GPUImage 的简单说明
- VB中With
- NSAutoreleasePool与autorelease 详解(一)
- Git常用基础命令总结
- UVa 10763 - Foreign Exchange
- [学习笔记]Java多态性
- iOS UserInterfaceState.xcuserstate文件在Git版本控制中不能忽略
- Qt_OpenGL:3D贴不同纹理小测
- 结构体变量 初始化 错误
- Android中程序与Service交互的方式——交互方式
- 四种方案解决ScrollView嵌套ListView问题