Iphone 如何创建本地自动释放池以节省内存?

Iphone 如何创建本地自动释放池以节省内存?,iphone,memory-management,Iphone,Memory Management,苹果说这是一个节省内存的好主意。这在代码中是什么样子的?通常您不需要创建自动释放池,因为系统关心这一点。但是,有时候你需要这样做。它通常是在大环。代码如下所示: NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; int i; for (i = 0; i < 1000000; i++) { id object = [someArray objectAtIndex:i]; // do somethin

苹果说这是一个节省内存的好主意。这在代码中是什么样子的?

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

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];
NSAutoreleasePool*pool=[[NSAutoreleasePool alloc]init];
int i;
对于(i=0;i<1000000;i++){
id object=[someArray objectAtIndex:i];
//用物体做某事
如果(i%1000==0){
[池释放];
池=[[NSAutoreleasePool alloc]init];
}
}
[池释放];

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

很好的描述。调用objectAtIndex:但是不会向自动释放池添加任何内容,因此可以在没有自动释放池的循环中使用它。请记住,Apple建议使用[pool drain]而不是[pool release]作为将来与GC环境兼容的一种习惯。@Marc Charbonneau那么不在池上调用release不会导致泄漏吗?不,在引用计数的环境中,调用drain与调用release是相同的。有关GC和非GC环境之间差异的更多信息,请查看文档。