【问题标题】:Is an autorelease pool necessary if I'm not creating autoreleased objects?如果我不创建自动释放对象,是否需要自动释放池?
【发布时间】:2011-07-01 00:51:51
【问题描述】:

我的意思是,如果我绝对确定我没有创建任何自动释放的对象,那么当然不会。我真正关心的是引擎盖下是否还有其他我不明白的地方。我有一个调用函数的后台线程。我必须始终创建一个自动释放池吗?

- (void)someFuncOnABackgroundThread
{
    //don't seem to need this. no leaks found
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    //do something that doesn't create any objects, or only use alloc/init/release

    NSString* str = [[NSString alloc] init];
    [str release];
    [pool drain];
}

【问题讨论】:

    标签: iphone ios memory-management nsautoreleasepool


    【解决方案1】:

    是的!你必须。您可能正在调用内部使用自动释放池的函数,因此您永远无法真正知道自己是否使用了任何自动释放。

    祝你好运!

    【讨论】:

    • 一些澄清:如果您的函数在主线程上并且您正在使用 UIKit(当然,您是)那么不,您不需要创建自己的池;一个在每个事件循环开始时创建并在结束时耗尽。如果您在主线程之外进行调用并且您正在进行任何类型的 Cocoa Touch 调用(例如您的 NSString),您确实需要创建一个。然而,两者都必须为真,才能需要一个。
    【解决方案2】:

    最终,这取决于您在实现中使用的接口。

    示例 1

    如果您正在与 Foundation 或其他 objc 类型进行交互,则应该这样做。毫无疑问。

    具体回答您发布的示例:在这种情况下一定要创建一个——NSString apis 应该假设一个自动释放池已经到位。

    示例 2

    如果你完全在 libc 中处理 api,则没有必要。

    底线

    • 可能需要很长时间才能了解在哪里需要(或不需要)。

    • 实现可以改变,它们可以引入自动释放的对象。

    • 您应该保证永远不会引入泄漏,尤其是出于如此简单的原因。

    • 这是一个需要克服的简单问题:如有疑问,请创建一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 2011-03-01
      • 1970-01-01
      相关资源
      最近更新 更多