【问题标题】:How do I create a local autorelease pool to save up memory?如何创建本地自动释放池以节省内存?
【发布时间】:2010-10-19 00:53:27
【问题描述】:

Apple 说这是节省内存的好主意。这在代码中会是什么样子?

【问题讨论】:

    标签: iphone memory-management


    【解决方案1】:

    通常你不需要创建自动释放池,因为系统关心这个。但是,有时您需要这样做。它通常在大循环中。代码如下所示:

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    int i;    
    for (i = 0; i < 1000000; i++) {    
      id object = [someArray objectAtIndex:i];
      // do something with object
      if (i % 1000 == 0) {
        [pool release];
        pool = [[NSAutoreleasePool alloc] init];
      }
    }
    [pool release];
    

    自动释放池保存为一个堆栈:如果您创建一个新的自动释放池,它会被添加到堆栈的顶部,并且每条自动释放消息都会将接收者放入最顶部的池中。

    【讨论】:

    • 很好的描述。调用 objectAtIndex: 但是不会向自动释放池添加任何内容,因此可以在没有自动释放池的情况下在循环中使用它。
    • 请记住,Apple 建议使用 [pool drain] 而不是 [pool release] 作为未来与 GC 环境兼容的习惯。
    • @Marc Charbonneau 那么你不会因为没有在池中调用 release 而导致泄漏吗?
    • 不,在引用计数环境中调用 drain 与调用 release 相同。查看文档以获取有关 GC 和非 GC 环境之间差异的更多信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    相关资源
    最近更新 更多