【问题标题】:Correct way of using @autoreleasepools?使用@autoreleasepools 的正确方法?
【发布时间】:2012-02-23 00:46:25
【问题描述】:

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

  • (void) 调用AutoReleasedObject,可能是我的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]];
    }
}

【问题讨论】:

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


    【解决方案1】:

    来自苹果的reference

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

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

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

    • 如果您生成辅助线程。您必须创建自己的自动发布 线程开始执行时立即池;否则,您的 应用程序将泄漏对象。 (参见“自动释放池和线程” 详情。)

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        对于像您的示例这样简单的事情,不要打扰。

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

          • 当您有一个会创建一堆临时对象的循环时,使用自动释放池非常有用。在这种情况下,您将希望尽快释放它们。否则很明显你应该避免它们。
          猜你喜欢
          • 1970-01-01
          • 2015-12-17
          • 2013-01-09
          • 2010-12-28
          • 2012-04-26
          • 2014-10-24
          • 2013-07-29
          • 2016-08-03
          • 2013-06-14
          相关资源
          最近更新 更多