ARC中方法中的autoreleasepool

时间:2012-11-27 17:32:51

标签: iphone ios ipad memory automatic-ref-counting

我想知道在方法内的ARC代码上使用@autoreleasepool是否有任何好处。

我是说这个。假设我有一个内存密集型方法,可以按顺序多次调用。像

这样的东西
// this is my code
for (id oneObject in objects {
  [self letsUseMemory];
}

然后

- (void) letsUseMemory {

  // heavy use of memory here

}

我这样做

- (void) letsUseMemory {

  @autoreleasepool {

    // heavy use of memory here

  }

}

有什么好处吗?我的意思是,当方法完成时,方法变量将被解除分配,因此在理论上添加自动释放池会带来任何好处,对吗?

或者该方法中的autoreleasepool会加速释放吗?

感谢。

2 个答案:

答案 0 :(得分:3)

  

有什么好处吗?我的意思是,当方法完成时,方法变量将被解除分配,因此在理论上添加自动释放池会带来任何好处,对吗?

这取决于。无论您是否使用ARC,在池耗尽之前,任何自动释放的临时对象都不会被释放。即:

NSString* foo = [NSString stringWithFormat:@"Bar: %@", baz];

如果没有封闭的@autoreleasepool,那么该对象实例可能会一直存在,直到您返回到运行循环。如果循环中存在该行代码,则可能正在累积大量这些临时对象。

一般的经验法则是,如果您有一个可能创建自动释放对象的潜在大循环,请使用@autoreleasepool将循环内部包装起来。

在@autoreleasepool中包装单个方法并不常见,也许有些无意义,因为如果在循环中多次调用该方法,它通常只会产生有意义的效果。将@autorelease池放在循环中会使意图更加清晰。

答案 1 :(得分:1)

我相信有很多“依赖”的东西,我相信。

从明显的开始,如果没有自动释放的对象,那没关系。如果您的代码在枚举完成后直接返回到运行循环,则无关紧要。

留下包含枚举的方法用于进行一堆初始化然后继续进行更多处理的情况。对于那个,你可以通过删除标记为以后发布的临时对象而受益。