正确使用@autoreleasepools的方法?

时间:2012-01-31 09:26:59

标签: objective-c cocoa-touch memory-management autorelease nsautoreleasepool

我想知道以下代码是否是使用新@autoreleasepool的好方法,我应该这样使用它还是让主自动释放池处理这些对象?

  • (void)callingAutoReleasedObject,可能是我的viewDidAppear,或者类似的函数。

谢谢!

- (UIBarButtonItem*)backButton {
    UIBarButtonItem* backButton = [[UIBarButtonItem alloc] initWithTitle:@"CustomBackTitle"
                                                                   style:UIBarButtonItemStyleBordered
                                                                  target:nil
                                                                  action:nil];
    return [backButton autorelease];
}

- (void) callingAutoReleasedObject {

    @autoreleasepool {
        [[self navigationItem] setBackBarButtonItem:[self backButton]];
    }
}

4 个答案:

答案 0 :(得分:8)

来自Apple的reference

  

但是,有三次你可以使用自己的   自动释放池:

     
      
  • 如果您正在编写一个不基于UI框架的程序,请执行此操作   作为命令行工具。

  •   
  • 如果你写一个创建很多的循环   临时对象。您可以在循环内创建自动释放池   在下一次迭代之前处理这些对象。用一个   循环中的自动释放池有助于减少最大内存   应用程序的足迹。

  •   
  • 如果你产生了一个辅助线程。您必须创建自己的自动释放   一旦线程开始执行,就会浮动池;否则,你的   应用程序将泄漏对象。 (请参阅“自动释放池和线程”   详情。)

  •   

我个人创建了几个@autoreleasepool块,以避免在使用Core Data的后台同步期间发生重大内存泄漏,因为框架(我喜欢)创建了大量自动释放的对象,必须将其耗尽以保留可用内存; )

答案 1 :(得分:2)

创建自动释放池的另一个原因是,如果您处于创建大量自动释放对象的循环中。

答案 2 :(得分:1)

通常在以下情况下创建自动释放池:

  • 您的计划开始
  • 你开始一个新线程
  • 您收到来自C或C ++界面的回调,并且您不知道调用者何时为您设置了一个池
  • 当你创建很多自动释放的对象时真的,这应该比许多人使用它们更常见。它们的创建非常轻巧。
  • 当自动释放的对象的数据/ ivars很大时,可以在池中提前释放。例如,一个保存像素数据或音频数据的objc对象。
  • 调试ref count偏移时。

对于像你的例子一样简单的事情,不要打扰。

答案 3 :(得分:0)

您需要定义自己的自动释放池的唯一原因是您还要创建自己的线程。

对于您上面所做的事情,绝对只需使用主要的自动释放池。