在 Objective-C 中如何处理 Autorelease 池中的对象?

Posted

技术标签:

【中文标题】在 Objective-C 中如何处理 Autorelease 池中的对象?【英文标题】:How objects in Autorelease pools are handled in Objective-C? 【发布时间】: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]; 
 

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

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

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

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

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

【讨论】:

以上是关于在 Objective-C 中如何处理 Autorelease 池中的对象?的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot.09.SpringBoot中如何处理Filter抛出的异常

Rust 中如何处理分布式内存并行性? [关闭]

Apache spark如何计算分区以及在executor中如何处理分区

Access表单中如何处理点击功能

在存储日期和时间的应用程序中如何处理多个时区?

Preact 中如何处理“refs”?