繁体   English   中英

正确使用@autoreleasepools的方法?

[英]Correct way of using @autoreleasepools?

我想知道以下代码是否是使用新的@autoreleasepool的好方法,我应该这样使用它还是让主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]];
    }
}

来自Apple的参考

但是,有三种情况可能会使用您自己的自动释放池:

  • 如果您正在编写不基于UI框架的程序,例如命令行工具。

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

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

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

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

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

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

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

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

对于您正在进行的操作,请务必使用主要的自动释放池。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM