iphone - ARC方法中的autoreleasepool

标签 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会有什么好处,对吗?

还是该方法中的autoreleasepool会加速重新分配?

谢谢。

最佳答案

有什么好处吗?我的意思是,方法完成后无论如何都将释放方法变量,因此从理论上讲,在其中添加一个autoreleasepool会有什么好处,对吗?

这取决于。直到池耗尽,所有自动释放的临时对象都不会被释放,无论您是否使用ARC。即:

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

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

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

将单个方法包装在@autoreleasepool中的情况较少见,也许没有意义,因为如果在循环中多次调用该方法,通常只会产生有意义的效果。将@autorelease池放入循环中可以使意图更加清晰。

关于iphone - ARC方法中的autoreleasepool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13589825/

相关文章:

iphone - 问题UIImage initWithData

iphone - 在 iOS 设备上运行 PHP 服务器和 MySQL

java - 是否可以用 Java 创建自己的 XMPP 服务器

ios - 如何制作带有图像 SWIFT 的弹出窗口

ios - objective-c (ipad)dismissViewControllerAnimated不工作

objective-c - 如何制作类似 Explore Flickr 应用旋转动画的动画

ios - MPMoviePlayerViewController 不通过流播放视频?

ios - 调用了 editActionsForRowAt IndexPath 但未显示 EDIT 和 DELETE

ios - 如何从另一个 iPhone 应用程序启动 MobileIron Web@Work 应用程序?

ios - 保存在 <Application_home>/Documents 中的文件在短时间内就会丢失