NSAutoreleasePool autorelease池如何工作?
据我了解,任何用alloc , new或copy创建的东西都需要手动发布。 例如:
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:排水与释放
  由于drain和release的功能似乎引起混淆,因此可能值得在此澄清(尽管这在文档中已有介绍)。 
  严格地说,从大局的角度来看, 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 [
