我的问题是当一个对象实际被添加到自动释放池中时? 创建自动释放池并在范围内声明对象时,是否将它们添加到自动释放池中,或者在指定为自动释放时将它们添加到池中。
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];
}
在这种情况下,只将字符串添加到池中,甚至将数组添加到池中?
答案 0 :(得分:0)
在调用-autorelease
时,对象被添加到自动释放池(是的,池,每个线程都有一堆堆栈),然后才会被调用。但是,在不包含单词'new','alloc'或'copy'的方法中(或多或少,我可能会忘记一两个),返回的值通常会在返回之前为您自动释放。你应该完全阅读memory management guide( 痛苦)。
答案 1 :(得分:0)
当发送自动释放方法时,对象仅添加到自动释放池 。
自动释放池堆栈,并且在对象发送自动释放时,对象仅添加到堆栈中最顶层的池(最近创建的)。
但是,自动释放池本身实际上位于堆栈中的下一个池中。因此,如果您排空最旧的池,那么之后创建的所有池也将被耗尽。这在抛出异常的情况下很重要。它可以通过包含自动释放池的堆栈框架抛出异常,而不会泄漏池或其中的对象。