Chinaunix首页 | 论坛 | 博客
  • 博客访问: 110505
  • 博文数量: 23
  • 博客积分: 1464
  • 博客等级: 上尉
  • 技术积分: 231
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-06 16:44
文章分类

全部博文(23)

文章存档

2014年(4)

2011年(3)

2009年(2)

2008年(14)

我的朋友

分类: iOS平台

2014-03-24 10:34: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];
}
阅读(2210) | 评论(0) | 转发(0) |
0

上一篇:ios-kvc\kvo 用法

下一篇:ios- 内存管理

给主人留下些什么吧!~~