【问题标题】:How objects in Autorelease pools are handled in Objective-C?在 Objective-C 中如何处理 Autorelease 池中的对象?
【发布时间】:2010-07-08 06:33:25
【问题描述】:

我的问题是一个对象何时真正添加到自动释放池中? 当创建自动释放池并在范围内声明对象时,它们是添加到自动释放池中还是在指定为自动释放时添加到池中。

int main(void) { 
    NSAutoreleasePool *pool; 
    pool = [[NSAutoreleasePool alloc] init]; 
    NSString *string; 
    NSArray * array;
    string = [[[NSString alloc] init] autorelease]; 
    array = [[NSArray alloc] init];
    /* use the string */ 
    [pool drain]; 
} 

在这种情况下,只是将字符串添加到池中,还是将数组添加到池中?

【问题讨论】:

    标签: objective-c memory-management


    【解决方案1】:

    -autorelease 被调用时,对象被添加到自动释放池(是的,池,每个线程有一个堆栈),并且只有在那时。但是,在不包含“new”、“alloc”或“copy”(或多或少,我可能会忘记一两个)的方法中,返回的值通常会在返回之前为您自动释放.您真的应该完整阅读memory management guide(这并不痛苦)。

    【讨论】:

    • 感谢 Jared 的回复。我还有一个疑问是当我创建嵌套池时,我可以使用嵌套池中的对象作为自动释放,其中对象是在父池中创建的。
    • @Cathy:是的,你可以,但这可能会混淆内存管理——正如文档所说,不要发布你没有创建或保留的东西。基本上我想不出你会干净地做到这一点的情况,尽管它在技术上绝对没问题,只要你不过度释放它(通过自动释放它两次)
    【解决方案2】:

    对象被添加到自动释放池只有当它们被发送自动释放方法时。

    自动释放池堆栈,并且对象仅在发送自动释放时添加到堆栈中最顶层的池(最近创建的)。

    但是,自动释放池本身实际上位于堆栈的下一个池中。因此,如果您排空最旧的池,则此后创建的所有池也将被排空。这在抛出异常的情况下很重要。它可以通过其中包含自动释放池的堆栈帧引发异常,而不会泄漏池或其中的对象。

    【讨论】:

      猜你喜欢
      • 2011-11-03
      • 1970-01-01
      • 2014-05-05
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      • 2011-11-05
      • 2010-10-27
      相关资源
      最近更新 更多