NSAutoreleasePool autorelease池如何工作?

据我了解,任何用allocnewcopy创建的东西都需要手动发布。 例如:

int main(void) {
    NSString *string;
    string = [[NSString alloc] init];
    /* use the string */
    [string release];
}

然而,我的问题不是这样吗?

int main(void) {
    NSAutoreleasePool *pool;
    pool = [[NSAutoreleasePool alloc] init];
    NSString *string;
    string = [[[NSString alloc] init] autorelease];
    /* use the string */
    [pool drain];
}

是的,你的第二个代码snippit是完全有效的。

每一次-autorelease被发送到一个对象,它被添加到最内层的autorelease池。 当池被耗尽时,它只会将-release发送到池中的所有对象。

自动释放池只是一种便利,可让您推迟发送-release,直到“稍后”。 “稍后”可能发生在几个地方,但Cocoa GUI应用程序中最常见的是在当前运行循环周期结束时。


NSAutoreleasePool:排水与释放

由于drainrelease的功能似乎引起混淆,因此可能值得在此澄清(尽管这在文档中已有介绍)。

严格地说,从大局的角度来看, drain不等于release

在引用计数环境, drain确实执行相同的操作作为release ,所以两者在这个意义上等同的。 要强调的是,这意味着如果您使用drain而不是release则不会泄漏池。

在垃圾收集的环境中, release是无操作的。 因此它没有效果。 另一方面, drain包含一个暗示,它应该“收集,如果需要”收集。 因此,在垃圾收集环境中,使用drain帮助系统平衡收集扫掠。


正如已经指出的,你的第二个代码片段是正确的。

我想建议一种更简洁的方式来使用适用于所有环境的自动释放池(参考计数,GC,ARC),并且还可以避免排水/释放混淆:

int main(void) {
  @autoreleasepool {
    NSString *string;
    string = [[[NSString alloc] init] autorelease];
    /* use the string */
  }
}

在上面的例子中,请注意@autoreleasepool块。 这是在这里记录。

链接地址: http://www.djcxy.com/p/72751.html

上一篇: How does the NSAutoreleasePool autorelease pool work?

下一篇: Stack corrupted with @autoreleasepool (ARC, compiled with llvm 3.0, Fastest, Smallest [