【问题标题】:Autorelease Pools in a for loop' s contextfor 循环上下文中的自动释放池
【发布时间】:2010-07-04 20:42:06
【问题描述】:

我正在阅读 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);
} 

上面写着:

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

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

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    你是对的。 FineName 在外部池中。如果在文档中是这样的,那就是一个错误。

    编辑:随时向 Apple 的雷达系统提交错误报告。

    【讨论】:

    • 你说得对,看起来应该是fileContents!真的,一定要提交一个错误,这样其他人就不必自己面对这个问题(甚至相信这一点!)。
    • 实际上,fileName 可能不在任何自动释放池中。快速枚举需要集合构建要枚举的对象的 C 数组。由于它已经拥有这些对象的所有权,因此不需要在将它们放入数组时自动释放它们。由于 processInfo 对象是一个单例,它可能不在自动释放池中,并且可能没有它的任何属性,包括参数数组。
    猜你喜欢
    • 1970-01-01
    • 2019-10-11
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 2012-01-22
    相关资源
    最近更新 更多