NSAutoreleasePool自动释放池如何工作?

据我了解,使用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];

}


喵喵时光机
浏览 539回答 3
3回答

泛舟湖上清波郎朗

是的,您的第二个代码段是完全有效的。每次将-autorelease发送给对象时,都会将其添加到最内部的autorelease池中。当池耗尽时,它仅向池中的所有对象发送-release。自动释放池只是一种便利,它使您可以将发送-发送推迟到“以后”。“稍后”可能会在多个地方发生,但是在Cocoa GUI应用程序中最常见的是当前运行循环周期的结尾。

慕神8447489

NSAutoreleasePool:消耗与释放由于功能drain和release似乎是造成混乱,它可能是值得澄清这里(虽然这是覆盖在文档 ...)。严格地说,从大局的角度drain是不等同于release:在引用计数的环境中,drain确实执行与相同的操作release,因此两者在此意义上是等效的。要强调的是,这意味着您使用而不是不会泄漏池。drainrelease在垃圾收集的环境中,release禁止操作。因此,它没有任何作用。 drain另一方面,向收集器暗示它应该“根据需要收集”。因此,在垃圾收集环境中,使用drain有助于系统平衡收集扫描。
打开App,查看更多内容
随时随地看视频慕课网APP