在for循环的上下文中自动释放池

时间:2010-07-04 20:42:07

标签: objective-c

我正在阅读iPhone OS的内存管理指南,我不明白自动释放池部分列表中的一点 - 1代码示例:

void main()
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSArray *args = [[NSProcessInfo processInfo] arguments];

for (NSString *fileName in args) {

    NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];

    NSError *error = nil;
    NSString *fileContents = [NSString stringWithContentsOfFile:fileName
                                       encoding:NSUTF8StringEncoding error:&error];

    /* Process the string, creating and autoreleasing more objects. */

    [loopPool release];
}

/* Do whatever cleanup is needed. */
[pool drain];

exit (EXIT_SUCCESS);
} 

它说:

“.......此外,在发布loopPool时,即使没有显式发送自动释放消息,也会释放在for循环上下文中创建的任何自动释放的对象(例如fileName)。” p>

我不明白的是,fileName变量如何包含在第二个池(loopPool)中,而不是第一个池(池)中。当第一个池是池堆栈中最顶层的池时,是不是创建了fileName?

1 个答案:

答案 0 :(得分:2)

你是对的。 fineName位于外部池中。如果它在文档中是这样的,那就是一个bug。

编辑:随意在Apple的雷达系统上提交错误报告。