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

时间:2010-07-08 06:33:25

标签: objective-c memory-management

我的问题是当一个对象实际被添加到自动释放池中时? 创建自动释放池并在范围内声明对象时,是否将它们添加到自动释放池中,或者在指定为自动释放时将它们添加到池中。

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]; 
} 

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

2 个答案:

答案 0 :(得分:0)

在调用-autorelease时,对象被添加到自动释放池(是的,池,每个线程都有一堆堆栈),然后才会被调用。但是,在不包含单词'new','alloc'或'copy'的方法中(或多或少,我可能会忘记一两个),返回的值通常会在返回之前为您自动释放。你应该完全阅读memory management guide 痛苦)。

答案 1 :(得分:0)

当发送自动释放方法时,对象仅添加到自动释放池

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

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