1

我想知道在方法内的 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 会加速释放?

谢谢。

4

2 回答 2

3

有什么好处吗?我的意思是,当方法完成时,方法变量无论如何都会被释放,所以在理论上添加一个自动释放池会有任何好处,对吧?

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

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

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

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

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

于 2012-11-27T17:51:41.943 回答
1

我相信,那里发生了许多“取决于”的事情。

从显而易见的开始,如果没有自动释放的对象,那没关系。如果您的代码在枚举完成后立即返回运行循环,那没关系。

这就留下了使用包含枚举的方法进行大量初始化然后继续进行更多处理的情况。对于那个,您可以通过摆脱标记为以后发布的临时对象而受益。

于 2012-11-27T17:41:23.353 回答