开发者社区 问答 正文

autorelease的对象到底会在什么时候被回收?

我有一个比较大的图片对象,临时的,是在一个循环里,要多次初始化的,用了autorelease,但是循环结束以后,在循环外还是可以看到最后一次的那个对象没被释放。我怀疑其他的对象也没被释放。。。但是我希望在循环以外,这些就被释放啊。。。
autorelease到底会在什么时候释放呢?

展开
收起
a123456678 2016-07-19 15:36:44 2087 分享 版权
1 条回答
写回答
取消 提交回答
  • 当然也有让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];

    }

    2019-07-17 19:58:26
    赞同 展开评论
问答地址: